Suporte Offline
O AISCouncil é um Progressive Web App (PWA) que funciona offline após a primeira visita. A aplicação inteira é um único arquivo HTML sem dependências externas, então pode ser completamente cacheado pelo service worker do navegador.
Progressive Web App (PWA)
O app registra um service worker (sw.js) que cacheia todos os assets estáticos no primeiro carregamento. Em visitas subsequentes, o app carrega instantaneamente do cache -- mesmo sem conexão com a internet.
Instalando como App
Chrome / Edge (Desktop):
- Visite aiscouncil.net
- Clique no ícone de instalação na barra de endereços (ou vá para Menu > "Install AISCouncil")
- O app abre em sua própria janela, com sua própria entrada na barra de tarefas
Chrome / Edge (Android):
- Visite aiscouncil.net
- Toque no menu do navegador (três pontos)
- Selecione "Add to Home screen" ou "Install app"
Safari (iOS / macOS):
- Visite aiscouncil.net
- Toque no botão Share
- Selecione "Add to Home Screen"
Quando instalado como PWA, o app roda em modo standalone -- sem chrome do navegador, experiência em tela cheia, e aparece como um app nativo no seu alternador de tarefas.
Estratégia de Cache do Service Worker
O service worker usa uma estratégia stale-while-revalidate:
- Primeira visita: Todos os assets pré-cacheados são baixados e armazenados no cache
- Visitas subsequentes: A versão cacheada é servida imediatamente (latência de rede zero), enquanto o service worker busca uma versão atualizada em background
- Próxima visita após update: A versão atualizada é servida do cache
Isso significa que você sempre obtém tempos de carregamento instantâneos, e atualizações chegam silenciosamente em background.
O Que É Cacheado
O service worker pré-cacheia estes arquivos na instalação:
| Arquivo | Propósito |
|---|---|
/ | Shell HTML (redireciona para /index.html) |
/index.html | A aplicação completa (~todo JS, CSS e HTML inline) |
/icon.svg | Ícone vetorial do app |
/icon-192.png | Ícone PNG 192x192 (Android home screen) |
/icon-512.png | Ícone PNG 512x512 (splash screens, maskable) |
/favicon.ico | Favicon da aba do navegador |
/manifest.webmanifest | Manifest PWA (nome, ícones, cor do tema) |
Adicionalmente, qualquer requisição GET same-origin que o app fizer será cacheada no primeiro fetch e servida do cache em requisições subsequentes (stale-while-revalidate).
O Que NÃO É Cacheado
| Recurso | Por Quê |
|---|---|
| Chamadas de API LLM | Estas vão diretamente para APIs de provedores (Anthropic, OpenAI, etc.) e requerem conexão com a internet |
| Atualizações de registro | Fetches do registro de modelos do GitHub requerem rede, mas o app cai para dados cacheados/empacotados |
| Recursos cross-origin | Apenas requisições same-origin são cacheadas pelo service worker |
| Requisições POST/PUT/DELETE | Apenas requisições GET são cacheadas |
| Chamadas de proxy de API | Requisições para /v1/* são explicitamente excluídas do cacheamento |
Capacidades Offline
Quando offline, você pode:
- Navegar chats existentes -- todo histórico de chat é armazenado localmente em IndexedDB
- Gerenciar perfis -- criar, editar e deletar perfis de bot
- Ver e mudar configurações -- todas as configurações estão em localStorage
- Exportar dados -- baixar seu arquivo JSON de backup
- Alternar entre bots -- todas as configs de bot são armazenadas localmente
- Ler conversas anteriores -- histórico completo de mensagens disponível
Quando offline, você não pode:
- Enviar novas mensagens -- requer uma chamada de API para o provedor LLM
- Atualizar o registro de modelos -- requer buscar do GitHub
- Fazer login -- OAuth requer conectividade de rede
- Instalar mini-programas -- requer buscar manifest e HTML de entrada
Usuários Ollama com uma instância local ainda podem conversar offline, já que Ollama roda em localhost e não requer acesso à internet.
Versionamento de Cache
O service worker usa um nome de cache versionado:
const CACHE = "ais-v1.0.0";
Quando a string de versão muda (em uma atualização que quebra compatibilidade), o novo service worker:
- Cria um novo cache com o novo nome
- Pré-cacheia todos os assets no novo cache
- Deleta todos os caches antigos na ativação
- Reivindica todos os clientes abertos
Isso garante que código cacheado obsoleto é limpo após grandes atualizações.
Atualizando o App
Atualizações acontecem automaticamente:
- Quando você visita a página, o navegador verifica se
sw.jsmudou - Se mudou, o novo service worker é instalado em background
- No próximo carregamento de página (ou após todas as abas serem fechadas e reabertas), o novo service worker ativa
- A nova versão é agora servida do cache
Para forçar uma atualização imediata: abra DevTools > Application > Service Workers, clique "Update" no service worker registrado, então recarregue a página. Alternativamente, segure Shift e clique no botão de recarregar do navegador para bypassar o cache.
Web App Manifest
O arquivo manifest.webmanifest define como o app aparece quando instalado:
{
"name": "AISCouncil",
"short_name": "AISCouncil",
"description": "Converse com Claude, GPT ou Grok -- sem servidor, sem setup.",
"start_url": "/",
"display": "standalone",
"background_color": "#000000",
"theme_color": "#7c3aed",
"categories": ["productivity", "utilities"],
"icons": [
{ "src": "icon.svg", "sizes": "any", "type": "image/svg+xml" },
{ "src": "icon-192.png", "sizes": "192x192", "type": "image/png" },
{ "src": "icon-512.png", "sizes": "512x512", "type": "image/png" },
{
"src": "icon-512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
}
]
}
| Campo | Valor | Propósito |
|---|---|---|
display | standalone | Roda sem UI do navegador (barra de endereços, abas) |
orientation | any | Funciona em retrato e paisagem |
theme_color | #7c3aed | Acento roxo para barra de status e barra de título |
background_color | #000000 | Fundo da splash screen enquanto o app carrega |
Solução de Problemas
O app mostra uma versão antiga:
- Abra DevTools > Application > Service Workers
- Clique "Unregister" no service worker antigo
- Recarregue a página
O app não funciona offline:
- Certifique-se de que o service worker está registrado (DevTools > Application > Service Workers)
- Certifique-se de que você visitou a página pelo menos uma vez enquanto online
- Verifique se o cache existe (DevTools > Application > Cache Storage)
- Alguns navegadores em modo privado/incognito desabilitam service workers
O prompt de instalação não aparece:
- A página deve ser servida via HTTPS (ou
localhost) - O service worker deve estar registrado e ativo
- O manifest deve ser válido e linkado no
<head>do HTML - Você deve ter visitado a página pelo menos duas vezes com algum tempo entre visitas (heurística do navegador)