Coloque o seu conteúdo em todas as telas com um código

O TEVIX é um aplicativo para Smart TV, celular e computador que vira o aplicativo da sua empresa. Você não precisa publicar nada nas lojas: o seu público instala o TEVIX, digita o seu código e o aparelho passa a abrir sempre direto no seu conteúdo, com o seu nome, a sua cor e o seu logo.

Sem desenvolver app

Serve para portais de notícias, rádios, TVs locais, igrejas, players de vídeo, câmeras ao vivo, qualquer site.

O conteúdo fica com você

Vídeo, áudio, imagens e páginas são carregados direto do seu servidor. O TEVIX só entrega o código aos aparelhos.

Um código, todos os aparelhos

Samsung, LG, Android TV, Fire TV, celular, computador e navegador. Controle remoto, toque e teclado.

Em 3 passos

PASSO 1

Crie o seu código

Na página de cadastro informe nome, cor, a URL do seu conteúdo e um contato. O código sai na hora, com teste grátis.

PASSO 2

Teste

Abra o TEVIX, digite o código e confira na TV, no celular e no computador. Ajuste a URL ou o visual na área do parceiro quando quiser.

PASSO 3

Divulgue

"Instale o TEVIX e digite ABC-123". A área do parceiro gera o texto pronto para o seu público.

Escolha o tipo de fonte

A "fonte" é de onde o TEVIX busca o seu conteúdo. Existem três tipos. Comece pelo mais simples para o seu caso; dá para trocar depois sem mudar o código.

TipoQuando usarO que você precisaComo aparece
SiteVocê já tem um site, player web ou painel que funciona bem em TV.Só a URL (ex.: https://player.suaradio.com.br).Tela cheia, sem menu do TEVIX. Igual a abrir o site no navegador da TV.
CompatívelVocê já tem um start.json de outro aplicativo de TV.A URL do seu start.json.O TEVIX lê o seu menu e as suas páginas e desenha com o visual do TEVIX. Nada a refazer.
TEVIXQuer um app com menu, destaques, grades de notícias, vídeos e rádio fixa.Arquivos JSON no formato abaixo, hospedados no seu servidor.Menu lateral, cards, leitor de matérias, player de rádio.

Site ou player web

Informe a URL completa. O aparelho abre essa página em tela cheia dentro do TEVIX. Funciona para qualquer site, mas para ficar bom na TV o site precisa aceitar navegação por setas e OK (foco visível nos botões). Se ele já funciona no navegador da TV, vai funcionar aqui.

Player ou site em http:// (sem HTTPS)? Funciona do mesmo jeito. O TEVIX percebe que o conteúdo é http e passa a rodar no endereço http dele, para abrir o seu player embutido, com o botão Voltar. Você não precisa mudar nada no seu servidor.
Enquanto o TEVIX estiver em http://, sites http:// e https:// funcionam. Quando o TEVIX passar a https://, um site http:// continua abrindo, mas por navegação direta em vez de embutido. Prefira sempre HTTPS no seu site.

Formato compatível (start.json)

Se você já tem um start.json publicado para outro aplicativo de TV, cadastre a URL dele (por exemplo https://seusite.com/app/start.json). O TEVIX entende:

Ainda não suportado nesse formato: plugins (video:plugin:, audio:plugin:), panel:, request:interaction: e propriedades estendidas. Esses itens mostram um aviso em vez de quebrar.

Formato TEVIX

É o formato mais completo e também simples: um arquivo principal (tevix.json) com a identidade e o menu, e um arquivo por página. Veja a seguir.

tevix.json: identidade e menu

{
  "tevix": "1.0",
  "app": {
    "name": "Portal Cidade",
    "tagline": "Notícias e Rádio 98,7",
    "short": "PC",
    "color": "#E8452C",
    "logo": "logo.png"
  },
  "menu": [
    { "id": "inicio",   "label": "Início",   "icon": "home",  "content": "inicio.json" },
    { "id": "aovivo",   "label": "Ao vivo",  "icon": "live",  "content": "aovivo.json" },
    { "id": "noticias", "label": "Notícias", "icon": "news",  "content": "noticias.json" },
    { "id": "radio",    "label": "Rádio",    "icon": "radio", "content": "radio.json" }
  ],
  "player": {
    "type": "audio",
    "title": "Rádio Cidade 98,7 FM",
    "subtitle": "Ao vivo",
    "url": "https://stream.suaradio.com.br/live.mp3"
  }
}
CampoObrigatórioDescrição
app.namesimNome que aparece no menu e no título. Até 40 caracteres.
app.taglinenãoLinha abaixo do nome.
app.shortnãoSigla de 2 letras usada quando não há logo.
app.colornãoCor da marca em hexadecimal. Colore o foco, os botões e o player.
app.logonãoImagem quadrada (mín. 128×128). URL absoluta ou relativa ao tevix.json.
menu[]sim1 a 8 itens. Cada um com label, icon e content (URL da página ou a página embutida como objeto).
playernãoRádio fixa na parte de baixo da tela. url do stream (mp3/aac). autoplay só funciona onde o aparelho permitir.
O que o painel do parceiro tiver preenchido (nome, cor, logo) tem prioridade sobre o app do tevix.json. Assim você pode trocar a cor sem mexer nos arquivos.

Páginas e blocos

Cada item do menu aponta para um arquivo de página. A página tem um título e uma lista de blocos, de cima para baixo.

{
  "title": "Início",
  "meta": "Atualizado há 4 min",
  "blocks": [
    { "type": "hero", "items": [ "1 destaque grande + até 2 laterais" ] },
    { "type": "row",  "title": "Últimos vídeos", "items": [ "carrossel horizontal" ] },
    { "type": "grid", "title": "Notícias",       "items": [ "grade de cards" ] },
    { "type": "list", "title": "Mais lidas",     "items": [ "lista numerada só com texto" ] }
  ]
}
BlocoPara quêItens
heroDestaque do topo (manchete, ao vivo).O 1º fica grande; o 2º e o 3º ficam ao lado. Use imagens 2:1 no primeiro.
rowCarrossel horizontal (vídeos recentes, programas).Qualquer quantidade; rola para o lado.
gridGrade de cards com imagem (notícias, canais).Qualquer quantidade; quebra em linhas.
listLista compacta só com título (ranking, programação).Até ~30 por bloco para ficar bom na TV.

Itens

{
  "k": "Esporte",
  "title": "Cidade FC vence e assume a liderança",
  "desc": "Gol aos 43 do segundo tempo garantiu a vitória.",
  "time": "há 1 h",
  "image": "https://seusite.com/img/futebol.jpg",
  "action": "text:materia/1235.json"
}
CampoDescrição
titleTítulo do card (obrigatório). Até 2 linhas na TV: prefira menos de 70 caracteres.
kEtiqueta curta no canto da imagem (editoria, "Ao vivo", "Podcast").
descResumo de até 2 linhas.
timeTexto pequeno (horário, duração, "há 22 min").
imageImagem 16:9 (ideal 640×360 ou 960×540, JPG). Sem imagem, o card usa um fundo neutro.
actionO que acontece ao selecionar. Veja abaixo.

Ações

AçãoO que fazObservações
video:URLAbre o player de vídeo em tela cheia.MP4 (H.264) ou HLS (.m3u8). HLS é o ideal para ao vivo.
audio:URLToca no player fixo de rádio, sem sair da página.MP3/AAC, stream ou arquivo. Dá play/pause com OK.
text:URLAbre uma matéria em tela de leitura.URL de um JSON no formato de matéria.
content:URLAbre outra página (JSON de página) com botão Voltar.Para programação completa, subcategorias, etc.
link:URLAbre um site em tela cheia dentro do app.Voltar fecha e retorna ao TEVIX.
link:window:URLAbre o site em nova janela (fora do app).Só faz sentido em computador.
info:textoMostra um aviso rápido.Ex.: "Ligue 0800 123 987".
content:plugin:ID, video:plugin:ID, panel:…, player:…Conteúdo e player controlados por um plugin seu.Veja Plugins.

URLs podem ser relativas ao arquivo em que estão (materia/1235.json, ../videos/x.mp4). Um item sem action é só informativo.

Plugins: conteúdo dinâmico do seu servidor

JSONs estáticos resolvem a maioria dos apps. Quando o conteúdo precisa de lógica em tempo real (programação que muda, player com login, progresso ao vivo, catálogo por usuário), use um plugin TEVIX: uma página HTML sua que roda escondida dentro do app e conversa com ele. O app pede o conteúdo ao plugin, o plugin responde com o mesmo JSON de página que você já conhece e, quando quiser, atualiza itens na tela, abre um vídeo, mostra um painel ou reage ao que o usuário faz.

Mesmo formato

O plugin devolve páginas, itens e ações iguais aos dos arquivos JSON. Nada novo para aprender na parte visual.

Tempo real

Relógio, placar, "no ar agora", progresso do programa: o plugin troca só os itens que mudaram, sem recarregar.

Sua lógica, seu servidor

A página do plugin fica hospedada com você. Pode chamar sua API, guardar dados no aparelho e identificar o dispositivo.

1. A página do plugin

Crie um HTML (ex.: https://seusite.com/tevix/plugin.html) que carrega a biblioteca e registra um handler. A página não tem interface: ela só responde ao app.

<!DOCTYPE html>
<html><head><meta charset="utf-8">
<script src="https://tevix.app/js/tevix-plugin.js"></script>
</head><body><script>
TevixPlugin.setupHandler({
  init: function (info) {
    // info.app {name,color,logo}, info.code, info.lang ("pt"|"en"|"es"), info.device.id, info.tevix
  },
  ready: function () {
    // conexão pronta: aqui você pode iniciar timers (ex.: atualizar itens a cada segundo)
  },
  handleRequest: function (id, data, reply) {
    // o app pede um conteúdo. "init" é o pedido padrão quando a página do plugin abre.
    if (id === "init") reply({
      headline: "No ar",
      pages: [{ items: [
        { id: "agora", layout: "0,0,8,2", titleHeader: "Agora", title: "Jornal da Manhã", progress: 0.4, action: "video:plugin:aovivo" },
        { layout: "8,0,4,2", type: "button", icon: "list", label: "Programação", action: "content:plugin:grade" }
      ]}]
    });
    else if (id === "aovivo") reply({ url: "https://cdn.seusite.com/live.m3u8", title: "Ao vivo" });
    else if (id === "grade") reply({ headline: "Programação", pages: [ /* ... */ ] });
    else reply({ error: "pedido desconhecido: " + id });
  },
  handleData: function (data) {
    // veio de uma ação "plugin:commit:ALGUMA-COISA" (string)
  },
  handleEvent: function (name, data) {
    // "player:play", "player:time" {position,duration}, "player:ended", "player:closed", "content:shown", "focus" {id}, "back", "visibility"
  }
});
</script></body></html>

reply() aceita um JSON de página (pages/template+items ou blocks), um objeto { "action": "video:..." } para só executar uma ação, ou { "error": "mensagem" }. Também pode devolver uma Promise. Se o plugin não responder em 20 segundos, o app mostra um erro com botão Tentar novamente.

2. Ligando o plugin ao app

No tevix.json, um item do menu pode apontar para o plugin em vez de um arquivo de página:

{
  "app": { "name": "TV Cidade", "color": "#E8452C" },
  "menu": [
    { "label": "Ao vivo", "icon": "live", "plugin": "https://seusite.com/tevix/plugin.html" },
    { "label": "Notícias", "icon": "news", "content": "noticias.json" }
  ]
}

Se o app inteiro é o plugin, use "plugin": "URL" direto na raiz do tevix.json (sem menu): o app abre sem barra lateral. Por padrão o app pede o conteúdo init; mude com "request": "outro-id". Dentro de qualquer página, estática ou vinda do plugin, use as ações da tabela abaixo. O plugin fica carregado enquanto o app estiver aberto, mesmo trocando de página; carregar um plugin de outra URL descarrega o anterior.

AçãoO que faz
content:plugin:ID@URLCarrega o plugin da URL (se ainda não estiver) e abre o conteúdo ID como página, com Voltar.
content:plugin:IDMesmo, no plugin já carregado. O ID não pode conter /, . ou :.
plugin:URLCarrega o plugin e abre o conteúdo init. Igual a content:plugin:init@URL.
plugin:commit:TEXTOEntrega TEXTO ao handleData do plugin. Use para botões ("favoritar", "entrar", "próximo").
video:plugin:ID · audio:plugin:IDPede ID ao plugin e reproduz o que vier: { "url", "title", "position" } ou { "action" }. Ideal para URLs assinadas ou que expiram.
panel:plugin:ID · panel:URLMostra um painel (janela sobre o conteúdo) com um JSON de página pedido ao plugin ou carregado da URL. panel:close fecha.
player:pause · resume · toggle · stop · seek:+30 · position:120 · label:TEXTOControla o player de vídeo/áudio em uso e o texto mostrado nele.
focus:IDMove o foco para o item com aquele id.
plugin:reload · plugin:unloadPede o conteúdo atual de novo · descarrega o plugin.
[ação1|ação2]Várias ações em sequência. Ex.: [panel:close|video:plugin:aovivo].

3. O que o plugin pode fazer no app

Tudo pela biblioteca TevixPlugin:

MétodoEfeito
updateItems([{ id, ...props }])Troca propriedades de itens na tela pelo id (título, imagem, progress, action...), sem recarregar a página. É o coração do tempo real.
updateContent(json)Substitui a página atual por outro JSON de página.
showContent(json)Abre um JSON de página por cima do atual, com Voltar.
reloadContent()Faz o app pedir o conteúdo atual de novo (chama handleRequest).
showPanel(json) · closePanel()Mostra ou fecha um painel.
play("video"|"audio", url, { title, position })Reproduz, opcionalmente continuando de uma posição.
setPlayerLabel(texto)Texto no player enquanto reproduz ("Jornal da Manhã · 12:04").
executeAction("...", dados)Qualquer ação da tabela acima (ex.: "player:pause", "back:", "content:plugin:grade").
updateMenu([...])Troca o menu do app (mesmo formato do menu do tevix.json).
requestData(id, cb)Pede dados ao app: "device:id", "info", "lang", "player:state", "content:current", "focus:current".
requestDeviceId(cb)Identificador estável deste aparelho (para login por dispositivo, limites, favoritos).
storage.set(chave, valor) · storage.get(chave, cb) · storage.remove(chave)Guarda dados no aparelho, separados por plugin.
busy(true, "Carregando…") · busy(false)Indicador de "aguarde" sobre o app.
toast(texto) · log() · warn() · error()Aviso rápido na tela · mensagens no console do app, para depurar.

4. Eventos que o app envia

Chegam em handleEvent(nome, dados):

EventoQuandoDados
player:play · player:pause · player:ended · player:error · player:loadedMudanças do player de vídeo ou áudio.{ url, position, duration, paused, ended }
player:timeA cada segundo durante a reprodução de vídeo.idem
player:closedO usuário fechou o vídeo (Voltar). Guarde a posição para "continuar assistindo".idem
content:shownUma página terminou de ser desenhada.{ id, title, depth }
focusO foco chegou a um item com id.{ id, panel }
panel:shown · panel:closedUm painel abriu ou fechou.{ id }
backO usuário apertou Voltar.{ depth, panel, overlay }
visibilityO app foi para segundo plano ou voltou.{ hidden }

5. Propriedades extras de páginas e itens

OndePropriedadePara quê
itemidIdentifica o item para updateItems, focus:ID e o evento focus.
itemprogressBarra de progresso de 0 a 1 na base do item (programa ao vivo, "continuar assistindo").
itemalignment"left" (padrão), "center" ou "right" para os textos.
itemimageFiller"cover" (padrão), "contain" ou "fill" para a imagem.
itemenabled: falseItem apagado e sem foco.
itemcolor · backgroundCores do item (CSS).
páginareadyAção executada assim que a página aparece (ex.: "plugin:commit:abriu").
páginalive{ "interval": 30, "action": "plugin:reload" }: repete a ação enquanto a página estiver na tela. Para atualizações mais finas, prefira updateItems.
Endereços. O app roda em https://, então a página do plugin também precisa estar em https:// (certificado gratuito com Let's Encrypt resolve). Os vídeos e áudios que o plugin devolve seguem a mesma regra dos JSONs. A biblioteca tevix-plugin.js é pequena, sem dependências e funciona nos navegadores antigos das TVs.
Para testar, crie o seu app grátis na área do parceiro apontando para o seu tevix.json com o plugin e abra o código no app. Abra o console do navegador no computador: as mensagens de TevixPlugin.log() aparecem com o prefixo [plugin].

Matérias (texto)

{
  "k": "Cidade",
  "title": "Prefeitura anuncia nova linha de ônibus",
  "subtitle": "Operação começa na segunda-feira com 12 veículos.",
  "date": "2 de novembro de 2026",
  "author": "Redação",
  "image": "https://seusite.com/img/onibus.jpg",
  "body": [
    "Primeiro parágrafo.",
    "Segundo parágrafo."
  ]
}

Cada item de body vira um parágrafo. Texto puro, sem HTML. A leitura usa letra grande, confortável a 3 metros da TV.

Rádio fixa

Com o campo player no tevix.json, o app mostra uma barra de rádio sempre visível. O ouvinte navega pelas notícias enquanto escuta. Qualquer item com audio: também toca nessa barra. Use um stream direto (.mp3 ou .aac), não uma página de player.

Ícones do menu

home live news video radio play movie tv music settings info link web star search list. Nomes de ícones Material Design (play-circle-outline, live-tv, ondemand-video…) são convertidos automaticamente; nomes desconhecidos viram um ponto.

Exemplo completo para copiar

O app de demonstração "Portal Cidade" está publicado e pode servir de modelo. Baixe os arquivos, troque textos, imagens e URLs e publique no seu servidor:

Para ver no app: abra o TEVIX e digite 8CR-EEC.

Hospedagem e CORS

Os arquivos JSON ficam no seu servidor, em qualquer hospedagem que sirva arquivos estáticos. O aparelho busca direto de lá, então duas coisas são obrigatórias:

  1. Liberar CORS: o servidor precisa responder com o cabeçalho Access-Control-Allow-Origin: * nos JSON (e nas imagens, se quiser).
  2. HTTPS sempre que possível. Certificados gratuitos (Let's Encrypt) resolvem.
Nginx
location ~* \.json$ {
    add_header Access-Control-Allow-Origin * always;
    add_header Cache-Control "public, max-age=300";
}
Apache (.htaccess)
<FilesMatch "\.json$">
    Header set Access-Control-Allow-Origin "*"
    Header set Cache-Control "public, max-age=300"
</FilesMatch>
Cloudflare Pages, Netlify, Vercel, GitHub Pages

GitHub Pages já envia CORS liberado. No Netlify crie _headers com /*.json e Access-Control-Allow-Origin: *. No Cloudflare Pages e Vercel, use o arquivo de headers da plataforma com a mesma regra.

WordPress

Coloque os JSON em uma pasta do site (ex.: /tevix/) e aplique a regra do Apache acima no .htaccess dessa pasta. Ou gere os JSON por plugin/REST (veja abaixo).

Cache: o app guarda o último JSON bom de cada página. Se o seu servidor cair, o público continua vendo a última versão. Mudanças aparecem em até 5 minutos (ou na hora, com "Limpar cache" nas configurações do app).

Gerar os arquivos automaticamente

Você não precisa escrever JSON à mão. Qualquer coisa que gere um arquivo de texto serve:

Testar o seu app

  1. Abra o TEVIX no navegador (ou na TV) e digite o seu código. Na área do parceiro há o botão Testar meu app agora, que já entra com o código.
  2. Navegue com as setas do teclado (ou do controle) e OK/Enter. Voltar: Backspace ou Esc.
  3. Mudou um JSON? Vá em Configurações → Limpar cache e recarregar dentro do app.
  4. Erro "Não foi possível carregar esta página" mostra a URL e o motivo (404, CORS, JSON inválido). Valide o JSON em um validador online antes de publicar.
  5. Em Configurações → Verificar código agora o app consulta o servidor do TEVIX na hora (útil logo após renovar o plano).

Dicas para ficar bom na TV

Planos, teste e vencimento

Teste grátis

Ao criar o código você ganha dias de teste (o prazo aparece na área do parceiro). Tudo funciona igual ao plano pago; o app mostra um selo "Teste".

Plano mensal

Um valor fixo por mês por código, sem limite de aparelhos. Renovado, o selo some e o prazo avança 30 dias.

Vencimento

Sem renovação, o código é suspenso. Os aparelhos mostram "Código suspenso. Fale com a empresa" na próxima verificação (até 6 h). Renovou, volta a funcionar sozinho.

Para contratar ou renovar, use o contato mostrado na área do parceiro. O código é sempre o mesmo: o seu público não precisa digitar nada de novo.

Área do parceiro

Em /parceiro você entra com o código e a senha escolhida no cadastro. Lá você pode:

Perguntas frequentes

Preciso publicar algo nas lojas da Samsung, LG ou Google?

Não. O TEVIX já está (ou estará) nas lojas. O seu público instala o TEVIX e digita o seu código.

Quantos aparelhos podem usar o mesmo código?

Ilimitado. O código identifica a sua empresa, não um aparelho.

Posso mudar o conteúdo depois?

Sim, a qualquer hora, trocando os seus arquivos JSON ou a URL na área do parceiro. O código continua o mesmo.

O TEVIX hospeda meus vídeos ou minha rádio?

Não. Tudo fica no seu servidor ou CDN. Isso mantém o serviço barato e o seu conteúdo sob o seu controle.

Já tenho um start.json de outro aplicativo. Preciso refazer?

Não. Cadastre a URL do seu start.json como fonte "Formato compatível". Plugins desse formato ainda não são suportados.

O app está em quais idiomas?

Português, inglês e espanhol. O TEVIX detecta o idioma do aparelho e permite trocar em Configurações. O seu conteúdo aparece no idioma em que você o escreve.

Como o usuário sai do meu app para digitar outro código?

No app, Configurações → Trocar código. Em fontes do tipo Site, pressione Voltar fora do site para abrir as configurações.

E se eu esquecer a senha da área do parceiro?

Fale com o suporte pelo contato da área do parceiro informando o seu código; a senha é redefinida.

Pronto para começar?
Crie o seu código agora e teste em todos os aparelhos.
Criar meu app grátisJá tenho código