This document describes how DomainExpert handles data. The application is a static single-page app; there is no DomainExpert backend to which your data is sent.
English version · Versão em português
DomainExpert runs entirely in your browser. It has no server, no database, no analytics and no telemetry. The only remote calls it makes are the ones you explicitly configure: the Google Gemini API, or a local server of your choice (for example LMStudio or Ollama).
Two keys are written to your browser's localStorage:
| Key | Purpose | Scope |
|---|---|---|
domain_expert_ai_config |
Provider choice, Gemini API key, local URL, local model name | Your browser, this origin |
domain_expert_history |
Up to 50 generated reports, including the original inputs, the AI response and any per-section feedback you wrote | Your browser, this origin |
The application does not set cookies, does not use IndexedDB, does not register a Service Worker, and does not install any tracking script.
Implementation references: src/services/settingsService.ts, src/services/historyService.ts, src/constants.ts.
Requests to AI providers are issued directly by your browser. DomainExpert does not proxy them through any intermediate server.
- Gemini provider. When you submit the form, the application calls
https://generativelanguage.googleapis.comthrough the official@google/genaiSDK. The request body contains the prompt built from your form inputs and the DDD output schema. Your Gemini API key is sent as an authentication header of that request. The key and the prompt are subject to Google's Terms of Service and Privacy Policy. - Local provider. The application calls the base URL you configured (for example
http://localhost:1234/v1/chat/completions). The request body contains the prompt and the response schema. No credential is sent unless your server requires one and you have added it to the URL.
Nothing else is transmitted. No analytics endpoint, no error-reporting service, no third-party fonts.
- Your history of generated reports.
- Your per-section comments and ratings.
- Any draft you have not submitted.
These live only in localStorage of the browser profile you are using.
- Inspect. Open DevTools, Application tab, Local Storage, this origin. The two keys above contain plain JSON.
- Export a single report. Open it in the UI and use the export menu (Markdown or JSON).
- Remove the API key. Open the AI Settings panel in the form and clear the field, or run
localStorage.removeItem('domain_expert_ai_config')in the console. - Remove a single report. Use the delete button next to the entry in the history view.
- Remove everything. Clear site data in the browser, or run
localStorage.clear()in the console.
The key is held in localStorage as plain text. This is a deliberate design choice for a no-backend application. Implications you should be aware of:
- Anyone with access to the browser profile can read the key. Do not use a shared or public device.
- The key is readable from any script executed on the same origin. This is a standard browser behavior.
- If you publish or share a deployed build, other users will use their own keys; yours is not embedded in the bundle. The build output contains no reference to the key.
- It is recommended to create a dedicated, restricted key for this application and to rotate it if you suspect it was exposed. Google API Console lets you scope keys by referrer and by API.
During pnpm dev, the Vite dev server exposes two proxy routes, /api/lmstudio and /api/ollama, that forward to http://localhost:1234 and http://localhost:11434 respectively. Their only purpose is to bypass CORS during local development. They are not active in a production build. In production, the browser connects directly to the URL you configure.
When you use the Gemini provider, your prompts are processed by Google. Their handling is governed by Google's terms, not by this project. The same applies to any local provider you point to: whatever logging, retention or sharing your local server performs is out of scope of this application.
This policy evolves with the code. Any material change will be reflected in this file and linked from the README.
O DomainExpert é executado inteiramente no seu navegador. Não existe servidor próprio, banco de dados, analytics ou telemetria. As únicas chamadas remotas feitas são as que você configura explicitamente: a API do Google Gemini ou um servidor local de sua escolha (por exemplo LMStudio ou Ollama).
Duas chaves são gravadas no localStorage do seu navegador:
| Chave | Finalidade | Escopo |
|---|---|---|
domain_expert_ai_config |
Provedor escolhido, chave da API do Gemini, URL local e nome do modelo local | Seu navegador, esta origem |
domain_expert_history |
Até 50 relatórios gerados, contendo as entradas originais, a resposta da IA e eventuais comentários por seção | Seu navegador, esta origem |
A aplicação não define cookies, não usa IndexedDB, não registra Service Worker e não instala scripts de rastreamento.
Referências de implementação: src/services/settingsService.ts, src/services/historyService.ts, src/constants.ts.
As requisições para provedores de IA são emitidas diretamente pelo seu navegador. O DomainExpert não faz proxy desse tráfego através de qualquer servidor intermediário.
- Provedor Gemini. Ao submeter o formulário, a aplicação chama
https://generativelanguage.googleapis.compor meio do SDK oficial@google/genai. O corpo da requisição contém o prompt construído a partir dos campos do formulário e o esquema de saída DDD. A chave da API do Gemini é enviada como cabeçalho de autenticação. A chave e o prompt estão sujeitos aos Termos de Serviço e à Política de Privacidade do Google. - Provedor local. A aplicação chama a URL base configurada (por exemplo
http://localhost:1234/v1/chat/completions). O corpo da requisição contém o prompt e o esquema de resposta. Nenhuma credencial é enviada, exceto se o seu servidor exigir uma e você a tiver colocado na URL.
Nenhum outro dado é transmitido. Não há endpoint de analytics, serviço de reporte de erros ou fontes de terceiros.
- Seu histórico de relatórios gerados.
- Seus comentários por seção e avaliações.
- Qualquer rascunho que você não tenha submetido.
Esses dados vivem apenas no localStorage do perfil do navegador que você está usando.
- Inspecionar. Abra o DevTools, aba Application, Local Storage, esta origem. As duas chaves acima contêm JSON puro.
- Exportar um relatório. Abra-o na interface e use o menu de exportação (Markdown ou JSON).
- Remover a chave da API. Abra o painel de Configurações de IA no formulário e limpe o campo, ou rode
localStorage.removeItem('domain_expert_ai_config')no console. - Remover um relatório específico. Use o botão de excluir ao lado da entrada, na tela de histórico.
- Remover tudo. Limpe os dados do site pelo navegador, ou rode
localStorage.clear()no console.
A chave é mantida em localStorage como texto puro. Essa é uma escolha deliberada de uma aplicação sem backend. Implicações que você deve levar em conta:
- Qualquer pessoa com acesso ao perfil do navegador pode ler a chave. Evite usar em dispositivos compartilhados ou públicos.
- A chave é legível por qualquer script executado na mesma origem. Esse é um comportamento padrão do navegador.
- Se você publicar ou compartilhar um build implantado, outros usuários usarão as próprias chaves; a sua não fica embutida no bundle. A saída de build não contém referência à chave.
- Recomenda-se criar uma chave dedicada e restrita para esta aplicação e rotacioná-la caso suspeite de exposição. O Google API Console permite escopar chaves por referrer e por API.
Durante pnpm dev, o servidor de desenvolvimento do Vite expõe duas rotas de proxy, /api/lmstudio e /api/ollama, que encaminham para http://localhost:1234 e http://localhost:11434, respectivamente. A única finalidade é contornar CORS durante o desenvolvimento local. Essas rotas não existem em um build de produção. Em produção, o navegador conecta-se diretamente à URL que você configurou.
Quando você usa o provedor Gemini, seus prompts são processados pelo Google. O tratamento desses dados é regido pelos termos do Google, não por este projeto. O mesmo vale para qualquer provedor local apontado: o log, a retenção ou o compartilhamento realizados pelo seu servidor local estão fora do escopo desta aplicação.
Esta política evolui junto com o código. Qualquer mudança material será refletida neste arquivo e referenciada a partir do README.