v0.9.0 · só código-fonte · Apache-2.0
Analytics local-first para suas sessões do OpenCode
O OpencodeView lê o histórico de sessões que já está no seu disco e transforma em analytics por projeto. Somente leitura no opencode.db, cache derivado próprio, redação antes de qualquer payload sair do processo — e nenhuma chamada externa, nunca.
Requer Bun ≥ 1.3.0 e uma instalação local do OpenCode. Sem pacote npm, sem binário, sem container — clone e rode.
Projeto companheiro independente e não oficial. Sem vínculo com o time do OpenCode.
$
Cinco invariantes, garantidas em código
Não é página de política. São afirmações que o processo faz no startup e em cada requisição.
-
Local-first
O bind padrão é loopback. A aplicação não abre socket de saída e não envia telemetria. Seu histórico de sessões nunca sai da máquina que o produziu.
OPENCODEVIEW_HOST=127.0.0.1 -
Fonte somente leitura
O banco do OpenCode é aberto em modo somente leitura no nível do engine e fixado com o pragma query_only. O OpencodeView é estruturalmente incapaz de escrever nele.
readonly: true · PRAGMA query_only = 1 -
Cache separado
Toda métrica derivada vai para um arquivo SQLite próprio. O caminho do cache é verificado para nunca ser o mesmo arquivo, symlink ou hardlink da fonte.
.cache/analytics.sqlite -
Redigir antes de sair
Payloads de transcrição e ao vivo passam por redação server-side antes de o JSON deixar o processo: chaves com cara de segredo, tokens bearer, prefixos de provedores, userinfo de URL e caminhos absolutos do home.
sk-… ghp-… → [REDACTED] -
Falha fechada
Fazer bind fora do loopback sem token de autenticação não gera aviso — o servidor se recusa a iniciar. Exposição é sempre decisão deliberada do operador.
sem token + bind público → exit
O produto
Sete lentes sobre o mesmo corpus
Cada aba responde uma pergunta operacional diferente sobre os agentes que você já rodou. O escopo é global ou por projeto; identificadores permanecem sem tradução, de propósito.
Para onde o orçamento realmente foi
Consolidações globais e por projeto: total de tokens, número de sessões, tempo ativo, chamadas de ferramenta e sessões sinalizadas. O volume de tokens por projeto é clicável — cada barra é um drill-down na tabela de sessões daquele projeto.
- Consolidação por projeto com tokens, sessões, tempo ativo e precisão de patch
- Distribuição de sinalizações em todo o corpus, ordenada por contagem
- Drill-down por projeto em uma tabela de sessões ordenável
- Contagem de subagentes exibida ao lado das sessões primárias

API
/api/global/api/projects/api/projects/:id
Previews sintéticos de documentação — não são dados reais de usuário.
Heurísticas
Oito sinalizações, derivadas localmente
Strings de protocolo estáveis, nunca traduzidas. Cada uma é uma regra sobre linhas do cache — um sinal operacional sobre as suas execuções, não um julgamento sobre o OpenCode.
-
Loop de falha de ferramenta
tool_failure_loopRegra tool_calls ≥ 20 e taxa de erro > 30%O agente insistiu em chamar ferramentas que continuaram falhando. Normalmente uma suposição errada sobre o ambiente.
-
Desperdício de patch
patch_wasteRegra patch_count > 50, apply_patch_ok = 0, summary_additions = 0Mais de cinquenta tentativas de patch, nada aplicado, nada adicionado. Queima pura.
-
Pressão de contexto
context_pressureRegra compaction_count > 15A sessão gastou mais esforço compactando contexto do que avançando.
-
Truncamento
truncationRegra ao menos uma mensagem com finish = lengthA saída bateu no teto de tokens. O que vinha depois nunca foi escrito.
-
Bug de metadados
omo_metadata_bugRegra título da sessão começa com o literal 'undefined'Um defeito de metadados do harness vazou para o título armazenado.
-
Anomalia de segurança
security_anomalyRegra título casa com heurísticas locais de string tipo injeçãoVale um olhar humano. Só casamento de string — sem modelo, sem rede.
-
Baixo retorno, alto custo
low_yield_high_costRegra > 1M tokens, sem adições, sem apply_patch bem-sucedidoUm milhão de tokens gastos sem nada aterrissar no diff.
-
Lacuna de qualidade de dados
data_quality_gapRegra mês da sessão cai em uma janela conhecida de baixa coberturaNão é problema da sessão — é problema do dataset. Sinalizado para nunca ser lido como zero real.
Arquitetura
Duas conexões SQLite, ambas somente leitura
Um scanner escreve o cache. Um servidor lê. O banco de origem nunca fica em estado gravável em nenhum ponto da árvore de processos.
opencode.db
fonte OpenCode · sempre RO
readonly · query_only
analytics.sqlite
cache derivado · RO para a API
scan.ts → write
Ecossistema
Onde ele se encaixa
O OpencodeView fica a jusante de dois projetos que não são dele. Um é obrigatório, o outro é opcional, e ele não tem vínculo com nenhum dos dois.
-
OpenCode
ObrigatórioO runtime dos agentes e o histórico de sessões
O OpenCode é dono do runtime dos agentes e do banco em disco que o OpencodeView lê. A evolução do schema pertence a eles, então o adaptador SQLite daqui é best-effort e pode ficar atrás de migrações upstream. Quando o dado de origem parece errado, é lá que se investiga — as sinalizações deste lado são heurísticas locais do operador, não afirmações sobre o OpenCode.
-
oh-my-openagent
OpcionalHarness opcional que enriquece a lente Ao vivo
Um harness de agentes para o OpenCode, também chamado de omo. Quando o log de atividade dele está legível, o servidor sobrepõe telemetria de polling por sessão na lente Ao vivo: o estado de saúde suspeita e eventos terminais como poll_timeout, max_turns, aborted_by_user e terminal_error. A sinalização omo_metadata_bug também nasce aí. Todo o resto funciona sem ele.
OH_MY_OPENCODE_LOG=$TMPDIR/oh-my-opencode.log Ambos são projetos de terceiros. O OpencodeView não tem vínculo, endosso ou manutenção compartilhada com nenhum dos dois.
Código
Está tudo no GitHub
Sem núcleo fechado, sem tier pago, sem binário embutido. O que você audita é o que você roda.
git clone https://github.com/4i3n6/opencodeview.git - Licença
- Apache-2.0
- Runtime
- Bun ≥ 1.3.0
- Servidor
- Hono
- UI
- React + Vite + Tailwind
- Armazenamento
- SQLite (fonte RO + cache derivado)
- Distribuição
- Só código-fonte
Estrutura do repositório
-
src/scan.tsconsolidações, sinalizações, schema do cache -
src/server.tsrotas Hono, guardas de bind e auth -
src/redaction.tslimpeza dos payloads de saída -
src/stats.tsauxiliares EWMA e changepoint -
web/src/dashboard, gráficos, catálogos i18n -
docs/resumo de arquitetura (EN + PT-BR) -
scripts/gates de release e identidade
O que a CI exige
- bun run test — suítes da raiz e da web
- bun run typecheck — TypeScript estrito nos dois workspaces
- bun run lint — oxlint
- bun run build — build de produção da web
- bun audit — advisórios de dependências
- Gitleaks — varredura obrigatória de segredos, reprova o gate
- Conventional Commits + validação do harness de release
Segurança
Padrões que assumem que você vai esquecer
A fronteira de confiança é a sua máquina. Todo padrão é escolhido para que o caminho inseguro exija digitar algo a mais.
-
Bind
Padrão 127.0.0.1, aceitando também localhost e ::1. Guardas de Host e Origin se aplicam no loopback.
-
Autenticação
Qualquer host fora do loopback exige OPENCODEVIEW_AUTH_TOKEN. Sem ele o processo encerra em vez de subir desprotegido.
-
Redação
Chaves com cara de segredo, tokens bearer, prefixos comuns de provedores, userinfo de URL e caminhos absolutos do home são substituídos antes da serialização.
-
Cache HTTP
Respostas da API vão com Cache-Control: no-store. Nada analítico fica em intermediário.
-
Telemetria
Não existe. O runtime não abre nenhuma conexão de analytics de produto para fora.
-
Cadeia de suprimentos
O Gitleaks roda como gate obrigatório no bun run check, junto de testes, typecheck, lint, build e auditoria de dependências.
Expor além do loopback é escolha do operador. Revise as regras de redação contra os seus próprios dados antes de fazer isso.
Honesto por padrão
Não-objetivos
Coisas que este projeto decidiu não ser.
- Substituir o OpenCode ou entregar uma UI oficial do OpenCode
- Alegar vínculo com ou endosso do time do OpenCode
- Analytics hospedado em nuvem ou multi-tenant
- Distribuição em npm/registries ou instalador — só execução via código-fonte
- Um contrato de integração estável e versionado contra o opencode.db antes do 1.0.0
Limitações conhecidas
Documentadas de cara, porque você vai esbarrar nelas.
- opencode.db é detalhe interno de implementação do OpenCode — o adaptador é best-effort e pode ficar atrás de mudanças de schema upstream
- cost só é comparável dentro do mesmo regime de cobrança; alguns modos de autenticação reportam zero
- Sessões de 2026-06 e 2026-07 têm cobertura incompleta de summary_additions e recebem a sinalização data_quality_gap
- Sessões que usaram as ferramentas legadas edit/write em vez de apply_patch não populam os contadores de apply_patch
- Espere mudanças incompatíveis no schema do cache, na API e na CLI antes do 1.0.0
Comece
Clone, escaneie, sirva
Três comandos entre você e o dashboard. Requer Bun ≥ 1.3.0 e um banco local do OpenCode.
-
Clone e instale
O workspace web instala em separado — é uma aplicação Vite distinta.
git clone https://github.com/4i3n6/opencodeview.git cd opencodeview bun install cd web && bun install && cd .. -
Materialize o cache
Lê a fonte em somente leitura e escreve as consolidações no próprio arquivo SQLite. Aponte OPENCODE_DB para outro lugar se sua instalação não for padrão.
bun src/scan.ts --all # ou um projeto só bun src/scan.ts --list bun src/scan.ts <projeto> -
Sirva o dashboard
API e UI rodam como dois processos, ambos presos ao loopback.
bun run serve # http://127.0.0.1:4317 bun run web # http://127.0.0.1:5273
FAQ
Perguntas que merecem resposta
O OpencodeView pode corromper meu banco do OpenCode?
Algum dado de sessão sai da minha máquina?
Isso é um produto oficial do OpenCode?
Como instalo — npm, brew, Docker?
O que são as sinalizações, exatamente?
Por que a precisão de patch às vezes fica indisponível?
Posso expor o dashboard na minha rede?
Funciona se meu banco do OpenCode estiver em um lugar incomum?
Seus agentes já escreveram os logs.
O OpencodeView só torna eles legíveis — na sua máquina, sob as suas regras.