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
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.
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.
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.
| Tipo | Quando usar | O que você precisa | Como aparece |
|---|---|---|---|
| Site | Você 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ível | Você 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. |
| TEVIX | Quer 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.
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.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:
parametercommenu:,content:eredirect:; os marcadores{PREFIX}e{SERVER}são preenchidos com o protocolo e o host do seu start.json.- Menu (
headline,menu[]comlabel,icon,datacomo URL ou objeto,execute,focus). - Conteúdo em
pages[].items[]comlayoutna grade 12×6 (ou 16×8 comcompress), e tambémtemplate+itemscom{context:...}eaction: "video:data". - Tipos de item
default,separate,teaser,button,space; campostitle,titleHeader,titleFooter,label,image,icon,action,execute,focus. - Ações
video:,audio:,link:,link:window:,content:,info:,reload:,back:e ações múltiplas[a|b].
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"
}
}
| Campo | Obrigatório | Descrição |
|---|---|---|
app.name | sim | Nome que aparece no menu e no título. Até 40 caracteres. |
app.tagline | não | Linha abaixo do nome. |
app.short | não | Sigla de 2 letras usada quando não há logo. |
app.color | não | Cor da marca em hexadecimal. Colore o foco, os botões e o player. |
app.logo | não | Imagem quadrada (mín. 128×128). URL absoluta ou relativa ao tevix.json. |
menu[] | sim | 1 a 8 itens. Cada um com label, icon e content (URL da página ou a página embutida como objeto). |
player | não | Rádio fixa na parte de baixo da tela. url do stream (mp3/aac). autoplay só funciona onde o aparelho permitir. |
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" ] }
]
}
| Bloco | Para quê | Itens |
|---|---|---|
hero | Destaque do topo (manchete, ao vivo). | O 1º fica grande; o 2º e o 3º ficam ao lado. Use imagens 2:1 no primeiro. |
row | Carrossel horizontal (vídeos recentes, programas). | Qualquer quantidade; rola para o lado. |
grid | Grade de cards com imagem (notícias, canais). | Qualquer quantidade; quebra em linhas. |
list | Lista 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"
}
| Campo | Descrição |
|---|---|
title | Título do card (obrigatório). Até 2 linhas na TV: prefira menos de 70 caracteres. |
k | Etiqueta curta no canto da imagem (editoria, "Ao vivo", "Podcast"). |
desc | Resumo de até 2 linhas. |
time | Texto pequeno (horário, duração, "há 22 min"). |
image | Imagem 16:9 (ideal 640×360 ou 960×540, JPG). Sem imagem, o card usa um fundo neutro. |
action | O que acontece ao selecionar. Veja abaixo. |
Ações
| Ação | O que faz | Observações |
|---|---|---|
video:URL | Abre o player de vídeo em tela cheia. | MP4 (H.264) ou HLS (.m3u8). HLS é o ideal para ao vivo. |
audio:URL | Toca no player fixo de rádio, sem sair da página. | MP3/AAC, stream ou arquivo. Dá play/pause com OK. |
text:URL | Abre uma matéria em tela de leitura. | URL de um JSON no formato de matéria. |
content:URL | Abre outra página (JSON de página) com botão Voltar. | Para programação completa, subcategorias, etc. |
link:URL | Abre um site em tela cheia dentro do app. | Voltar fecha e retorna ao TEVIX. |
link:window:URL | Abre o site em nova janela (fora do app). | Só faz sentido em computador. |
info:texto | Mostra 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ção | O que faz |
|---|---|
content:plugin:ID@URL | Carrega o plugin da URL (se ainda não estiver) e abre o conteúdo ID como página, com Voltar. |
content:plugin:ID | Mesmo, no plugin já carregado. O ID não pode conter /, . ou :. |
plugin:URL | Carrega o plugin e abre o conteúdo init. Igual a content:plugin:init@URL. |
plugin:commit:TEXTO | Entrega TEXTO ao handleData do plugin. Use para botões ("favoritar", "entrar", "próximo"). |
video:plugin:ID · audio:plugin:ID | Pede ID ao plugin e reproduz o que vier: { "url", "title", "position" } ou { "action" }. Ideal para URLs assinadas ou que expiram. |
panel:plugin:ID · panel:URL | Mostra 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:TEXTO | Controla o player de vídeo/áudio em uso e o texto mostrado nele. |
focus:ID | Move o foco para o item com aquele id. |
plugin:reload · plugin:unload | Pede 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étodo | Efeito |
|---|---|
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):
| Evento | Quando | Dados |
|---|---|---|
player:play · player:pause · player:ended · player:error · player:loaded | Mudanças do player de vídeo ou áudio. | { url, position, duration, paused, ended } |
player:time | A cada segundo durante a reprodução de vídeo. | idem |
player:closed | O usuário fechou o vídeo (Voltar). Guarde a posição para "continuar assistindo". | idem |
content:shown | Uma página terminou de ser desenhada. | { id, title, depth } |
focus | O foco chegou a um item com id. | { id, panel } |
panel:shown · panel:closed | Um painel abriu ou fechou. | { id } |
back | O usuário apertou Voltar. | { depth, panel, overlay } |
visibility | O app foi para segundo plano ou voltou. | { hidden } |
5. Propriedades extras de páginas e itens
| Onde | Propriedade | Para quê |
|---|---|---|
| item | id | Identifica o item para updateItems, focus:ID e o evento focus. |
| item | progress | Barra de progresso de 0 a 1 na base do item (programa ao vivo, "continuar assistindo"). |
| item | alignment | "left" (padrão), "center" ou "right" para os textos. |
| item | imageFiller | "cover" (padrão), "contain" ou "fill" para a imagem. |
| item | enabled: false | Item apagado e sem foco. |
| item | color · background | Cores do item (CSS). |
| página | ready | Ação executada assim que a página aparece (ex.: "plugin:commit:abriu"). |
| página | live | { "interval": 30, "action": "plugin:reload" }: repete a ação enquanto a página estiver na tela. Para atualizações mais finas, prefira updateItems. |
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.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:
- tevix.json (identidade, menu e rádio)
- inicio.json (hero, carrossel e lista), noticias.json (grade), radio.json (áudio e
content:) - materia/1234.json (matéria)
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:
- Liberar CORS: o servidor precisa responder com o cabeçalho
Access-Control-Allow-Origin: *nos JSON (e nas imagens, se quiser). - 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).
Gerar os arquivos automaticamente
Você não precisa escrever JSON à mão. Qualquer coisa que gere um arquivo de texto serve:
- Site WordPress / RSS: um script (PHP, Python, Node) lê o feed RSS e grava
inicio.jsonenoticias.jsona cada 5 minutos. Título →title, resumo →desc, imagem destacada →image, link da matéria → gere ummateria/ID.jsoncom o texto. - Rádio: um
radio.jsonfixo com o stream e a programação; mude osubtitledo player com o programa do momento. - Vídeos: a API do YouTube ou do seu CDN lista os últimos vídeos; use
video:com o MP4/HLS direto. Páginas do YouTube não tocam dentro do app; é preciso o arquivo de mídia.
Testar o seu app
- 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.
- Navegue com as setas do teclado (ou do controle) e OK/Enter. Voltar: Backspace ou Esc.
- Mudou um JSON? Vá em Configurações → Limpar cache e recarregar dentro do app.
- 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.
- 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
- Imagens 16:9 e leves (JPG até 150 KB). Sem texto pequeno dentro da imagem.
- Títulos curtos. Na TV o texto é lido a 3 metros.
- Até 8 itens no menu. Comece pelo que o público mais usa (Ao vivo, Início).
- Para ao vivo, use HLS (
.m3u8) com 2 ou 3 qualidades. MP4 progressivo serve para vídeos curtos. - Se você usa o tipo Site, garanta que o site tenha foco visível e funcione com Tab/setas; sem mouse, o usuário só tem o controle.
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:
- Ver a situação do plano, a validade e quantos aparelhos usaram o app nos últimos 7 dias.
- Trocar a URL do conteúdo, o nome, a cor e o logo. Os aparelhos atualizam na próxima abertura.
- Copiar as instruções prontas para divulgar ao público.
- Testar o app com um clique e trocar a sua senha.
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.
Crie o seu código agora e teste em todos os aparelhos.