Pular para o conteúdo
OpencodeView

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.

Início rápido — copiar/colar
$

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
Visão geral — Dashboard do OpencodeView com árvore de sessões ao vivo, consolidação de tokens e analytics de delegação

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_loop
    Regra 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_waste
    Regra patch_count > 50, apply_patch_ok = 0, summary_additions = 0

    Mais de cinquenta tentativas de patch, nada aplicado, nada adicionado. Queima pura.

  • Pressão de contexto

    context_pressure
    Regra compaction_count > 15

    A sessão gastou mais esforço compactando contexto do que avançando.

  • Truncamento

    truncation
    Regra ao menos uma mensagem com finish = length

    A saída bateu no teto de tokens. O que vinha depois nunca foi escrito.

  • Bug de metadados

    omo_metadata_bug
    Regra 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_anomaly
    Regra título casa com heurísticas locais de string tipo injeção

    Vale um olhar humano. Só casamento de string — sem modelo, sem rede.

  • Baixo retorno, alto custo

    low_yield_high_cost
    Regra > 1M tokens, sem adições, sem apply_patch bem-sucedido

    Um milhão de tokens gastos sem nada aterrissar no diff.

  • Lacuna de qualidade de dados

    data_quality_gap
    Regra mês da sessão cai em uma janela conhecida de baixa cobertura

    Nã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

scan.ts — só escreve o cache transcrição + ao vivo — RO, redigido

analytics.sqlite

cache derivado · RO para a API

scan.ts → write

server.ts (Hono)
/api/* — loopback
UI Vite

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ório

    O 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

    Opcional

    Harness 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.

Aponte o servidor para o log do harness: 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.ts consolidações, sinalizações, schema do cache
  • src/server.ts rotas Hono, guardas de bind e auth
  • src/redaction.ts limpeza dos payloads de saída
  • src/stats.ts auxiliares 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.

  1. 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 ..
  2. 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>
  3. 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?
Não. A conexão com a fonte é aberta com readonly: true e fixada com PRAGMA query_only = 1, então escritas são rejeitadas no nível do engine SQLite, e não por lógica de aplicação. O caminho do cache ainda é validado para nunca resolver no mesmo arquivo, symlink ou hardlink da fonte.
Algum dado de sessão sai da minha máquina?
Não. Não há telemetria e o runtime não abre conexão de saída. O bind padrão é loopback, e ir além dele exige definir um token de autenticação — sem ele o servidor se recusa a iniciar em vez de expor uma superfície não autenticada.
Isso é um produto oficial do OpenCode?
Não. O OpencodeView é um companheiro independente e não oficial para quem já roda o OpenCode localmente. Não tem vínculo nem endosso do time do OpenCode, e não substitui a superfície de produto do próprio OpenCode.
Como instalo — npm, brew, Docker?
Nenhum desses. A v0.9.0 é só código-fonte por decisão de projeto: clone o repositório e rode com Bun. Não há pacote npm, binário, container ou instalador, e APIs, schema do cache, flags de CLI e variáveis de ambiente devem ser tratados como instáveis até o 1.0.0.
O que são as sinalizações, exatamente?
Rótulos heurísticos calculados localmente sobre linhas de sessão no cache — por exemplo, um loop de falha de ferramenta é 20 ou mais chamadas com taxa de erro acima de 30 por cento. São sinais operacionais sobre as suas execuções, derivados de dados no seu disco. Não são afirmações sobre a qualidade do produto OpenCode.
Por que a precisão de patch às vezes fica indisponível?
Porque sessões que usaram as ferramentas legadas edit e write nunca populam os contadores de apply_patch. Em vez de inferir um número, a interface renderiza um estado explícito de indisponível — uma métrica ausente jamais deve poder ser lida como zero.
Posso expor o dashboard na minha rede?
Pode, e é deliberadamente cheio de atrito. Defina OPENCODEVIEW_HOST com um endereço fora do loopback e OPENCODEVIEW_AUTH_TOKEN com um token bearer; omitir o token aborta o startup. Revise as regras de redação contra suas próprias transcrições antes de fazer isso.
Funciona se meu banco do OpenCode estiver em um lugar incomum?
Sim. Defina OPENCODE_DB com o caminho que você usa. O padrão é ~/.local/share/opencode/opencode.db, e todos os outros caminhos do sistema também são configuráveis por variáveis de ambiente.

Seus agentes já escreveram os logs.

O OpencodeView só torna eles legíveis — na sua máquina, sob as suas regras.