Config map
app/config/ é a superfície brand-editável do template: só dados e config, nenhum maquinário.
Está organizada em 22 subpastas semânticas por domínio, mais 4 arquivos soltos de escopo global.
Convenção de import
import { themeColors } from "~/config/theme/colors";
import { routePaths } from "~/config/routes/paths";
import { featuresConfig } from "~/config/features/features";
import { sportsConfig } from "~/config/sports/sports";
import { sidebarButtonsConfig } from "~/config/widgets/sidebar-buttons";
Três regras:
- O caminho é sempre
~/config/<dir>/<arquivo>— o diretório de domínio é obrigatório. - Não existe sufixo
.config.~/config/theme.config,app/config/sports.config.ts,~/config/routes.pathse afins são caminhos pré-reorg e não resolvem. - O sufixo
.server, quando existe, é semântico: aquele config só pode ser importado de código server-side (ex:~/config/gamification/gamification.server,~/config/seo/page-descriptions.server,~/config/legal/pages-content.server).
Como o override de brand funciona
O brandOverridesPlugin (vite-plugins/brand-overrides.ts) intercepta cada
import "~/config/<dir>/X". Se existir overrides/<brand-key>/app/config/<dir>/X.ts, ele usa esse
arquivo inteiro. O <brand-key> vem do ORIGIN_DOMAIN com . → -.
:::danger Substituição de arquivo, nunca deep-merge
Não há merge campo a campo. Ao adicionar um campo novo num config que tem overrides, propague para
todos os overrides existentes — senão aquela brand recebe undefined. Dois padrões escapam disso
de propósito: defineLayoutConfig() (que faz deep merge com os defaults dentro do arquivo) e
tokens com fallback explícito no consumidor (ex: themeColors.money ?? themeColors.success no
tailwind.config.js). Ver Forking — Override Files.
:::
Três arquivos de routes/ são especiais: além do plugin, eles são lidos em config time por
app/router/routes.ts (via vite-plugins/brand-resolver.mjs), porque geram rotas antes do build da
árvore — paths.ts, lp-redirects.ts e legacy-redirects-cross-brand.ts. Ver Routing.
Os três arquivos parseados pelo tailwind.config.js (theme/colors.ts, theme/sizes.ts,
theme/fonts.ts) têm uma restrição extra de forma literal — ver Theming.
Os 22 domínios
A coluna "override" indica se alguma brand em overrides/ sobrescreve algum arquivo do domínio
hoje. Para o estado exato, ls overrides/<brand-key>/app/config/.
| Domínio | Configura | Arquivos | Override |
|---|---|---|---|
analytics/ | Trackers e o contrato de eventos: analytics.ts (GTM/Pixel, com undefined caindo nos valores da API), analayer.ts (subsistema GA4), appsflyer.ts, hotjar.ts, pendo.ts, schema.ts (fonte de verdade do dataLayer) | 6 | ✅ |
auth/ | legal-texts.ts — bloco de informativos legais nos modais de auth (default desligado) | 1 | ✅ |
cashback/ | eligible-games.ts — IDs de jogos elegíveis ao fluxo FTD Cashback (D0) | 1 | ✅ |
catalog/ | Curadoria do catálogo: categories.personalize.ts (personalize das categorias do BFF), category-chip-order.ts (ordem curada dos chips), game-thumbs.ts (thumbs custom por slug), smart-related.ts (exclusões da sidebar de sugestões) | 4 | ✅ |
content/ | Conteúdo estático/curado: faq.server.ts, game-details.server.ts (SEO + descrição por jogo), help-category-icons.ts, promocode.ts | 4 | ✅ |
features/ | Feature flags por escopo: features.ts (geral), account.ts, auth.ts, contents.ts (áreas de conteúdo), remarketing.ts, phone-outage-notice.ts | 6 | ✅ |
ftd-checkin/ | ftd-checkin.ts — check-in diário pós-FTD (desligado no base) | 1 | ✅ |
gamification/ | Smartico: gamification.ts (client), gamification.server.ts (chaves server, incl. salt do hash), gamification-ui.ts (aparência por superfície) | 3 | ✅ |
layout/ | Composição e navegação: composition.ts (shell/estrutura/slots), header.ts, header-secondary-nav.ts, sidebar.ts, sidebar-sports.ts, bottomnav.ts, footer.ts, menu.ts, user-tabs.ts | 9 | ✅ |
legal/ | pages.ts (quais páginas legais existem + chaves i18n), pages-content.server.ts (fallback HTML), licenses.ts, extra-legal-links.ts, hidden-footer-slugs.ts e a pasta html/ com o conteúdo por documento | 5 + html/ | ✅ |
payments/ | deposit.ts (atalhos de valor e badges por moeda), methods.ts (filtro sobre o que o BFF devolve), kushki.ts, testers.ts (user IDs que veem métodos is_test) | 4 | ✅ |
profiles/ | index.ts + pasta profiles/ — perfis de influenciadores. O base não traz nenhum | 1 + profiles/ | ✅ |
referral/ | v1.ts e v2.ts (as duas variantes do fluxo "Indique e ganhe") + eligible-games.ts | 3 | ✅ |
routes/ | paths.ts (o Route Registry), legacy-redirects.ts, legacy-redirects-cross-brand.ts, lp-redirects.ts, lps.ts + pasta lps/, live-hub-redirect.ts | 6 + lps/ | ✅ |
scripts/ | Injeção e delivery: scripts.ts (tags <script> arbitrárias em head/body), images.ts (Cloudflare Images, incl. useProxy), games.ts | 3 | ✅ |
search/ | popular-terms.ts — chips de termos populares no estado idle de /search | 1 | — |
sections/ | Rows das páginas: home-rows.legacy.ts, casino-rows.legacy.ts, casino-live-rows.legacy.ts (usados nos modos legacy/mixed) e home-row-overrides.ts (apresentação por slug das rows vindas do BFF) | 4 | ✅ |
seo/ | seo.ts (tokens de verificação, OG fallback, perfis sociais), hreflang.ts, sibling-route-paths-7k.ts, sitemap.ts (grupos extras), page-descriptions.server.ts, games-seo.server.ts, sports-seo.ts, branded-home-links.ts | 8 | ✅ |
sports/ | sports.ts (sportsbook principal + o de teste), provider.ts (helper do override por ambiente FORCE_SPORTBOOK) | 2 | ✅ |
strategy/ | strategy.ts — campanhas em iframe disparadas por UTM (desligado no base) | 1 | ✅ |
theme/ | colors.ts, fonts.ts, sizes.ts, font-preloads.ts, header.ts, mobile-bottom-nav.ts, search-input.ts — ver Theming | 7 | ✅ |
widgets/ | 37 configs de widget — ver Widgets catalog | 37 | ✅ |
Arquivos soltos (escopo global)
| Arquivo | Configura | Override |
|---|---|---|
app-install.ts | Todo o fluxo "Baixar App" da brand (substituiu o campo único brand.appearance.links.appDownload) | ✅ |
brand-appearance.ts | Força campos de brand.appearance no front, ignorando o valor do BFF | ✅ |
brand-links.ts | Força campos de brand.appearance.links no front, ignorando o BFF | — |
version-panel.ts | Painel de versão/cache + window.__forceClearCache — diagnóstico e recuperação de cache preso | — |
O que toda brand nova precisa sobrescrever
Estes 15 arquivos são sobrescritos por todas as 13 brands em overrides/ hoje. Trate como o
mínimo de um fork novo:
analytics/appsflyer.ts
features/account.ts
features/auth.ts
features/contents.ts
features/features.ts
features/remarketing.ts
gamification/gamification.ts
sections/casino-live-rows.legacy.ts
sections/casino-rows.legacy.ts
sections/home-rows.legacy.ts
sports/sports.ts
theme/colors.ts
theme/sizes.ts
widgets/bottom-notifications.ts
widgets/stories.ts
Quase universais (12 de 13): routes/paths.ts, layout/sidebar.ts, legal/licenses.ts,
scripts/images.ts, seo/page-descriptions.server.ts.
:::info Só 13 brands vivem no base
cassino.bet.br e vera.bet.br foram removidos do base em 2026-07 e não têm mais
override nem environment de deploy neste workspace.
:::
Adicionando um config novo
- Escolha o domínio existente que melhor descreve o assunto. Domínio novo só quando nada serve.
- Crie
app/config/<dir>/<nome>.tsexportando uma const nomeada e tipada. - Declare o tipo em
app/types/quando ele for consumido em mais de um lugar. - Se o config precisar rodar só no server, use o sufixo
.server. - Se um campo novo entra num arquivo que já tem overrides, propague para todos eles.
Convenção geral: o base traz o default desligado/vazio e a brand liga via override. Isso é o que mantém o template neutro e cada fork explícito sobre o que usa.