App desktop para gerenciar modelos locais do Ollama: chat com streaming, tarefas agendadas por cron com pesquisa web e painel de hardware, tudo rodando na sua máquina.
O Ollama roda modelos locais por linha de comando. O OllaHub coloca uma interface desktop em cima dele: verifica se o Ollama está instalado e em execução (e oferece instalação guiada quando não está), baixa e remove modelos mostrando o progresso do download, abre conversas com streaming de resposta e guarda o histórico com busca full-text.
Além do chat, o app executa tarefas recorrentes em segundo plano. Uma tarefa agendada pode pesquisar na web, resumir o resultado com um modelo local e salvar tudo como uma conversa, notificando no fim. Também estão incluídos servidores MCP, monitoramento de CPU/RAM/GPU e atualização automática do próprio app.
Janela Tauri (sem decoração nativa) + WebView
│
├── Frontend: Next.js exportado estático (out/), React 19
│ invoke() ─────────────┐
│ eventos ◀─────────────┤ chat-token, download-progress,
│ │ system-stats, task-*
▼ ▼
Backend Rust (src-tauri) ── 67 comandos Tauri registrados
├── chat e sessões: rusqlite (SQLite + FTS) e arquivos JSON
├── Ollama: HTTP em http://localhost:11434 (reqwest)
├── busca web: Chrome headless (headless_chrome) + scraper
├── agendamento: tokio-cron-scheduler
├── embeddings: ONNX Runtime (ort) + tokenizers
└── hardware: sysinfo e nvidia-smi
- A interface é um export estático do Next.js embutido no binário pelo Tauri; não existe servidor Node em produção.
- O backend Rust expõe comandos (
invoke) e eventos para a interface. Toda a lógica de arquivos, banco, scraping e agendamento vive no Rust. - O histórico fica em
ollahub.db(SQLite com busca full-text) no diretório de dados do app, com os arquivos JSON antigos mantidos como compatibilidade. - As tarefas agendadas rodam no processo do app; cada execução grava o resultado como uma sessão de chat.
| Camada | Escolha |
|---|---|
| Desktop | Tauri v2 (2.9.x), janela sem decoração, plugins updater, notification, shell, autostart e log |
| Frontend | Next.js 16 (App Router, output: export), React 19, TypeScript 5 |
| Interface | Tailwind CSS 4, componentes shadcn/ui (Radix), lucide-react, framer-motion |
| Estado | zustand |
| Markdown | react-markdown, remark-gfm, react-syntax-highlighter |
| Backend | Rust (edition 2021, rust-version = 1.77.2) |
| Banco | SQLite via rusqlite (bundled) com FTS5; arquivos JSON como legado |
| Busca web | headless_chrome, scraper, readability, html2text |
| Agendamento | tokio-cron-scheduler |
| Embeddings | ort (ONNX Runtime) e tokenizers para ranqueamento de relevância |
| Monitor | sysinfo e nvidia-smi |
| Pacotes | pnpm (lockfile 9.0) |
| CI/CD | GitHub Actions (release.yml): bundles para Windows, macOS e Linux |
- Node.js
>= 20.9(exigido pelo Next 16) - pnpm
>= 9(opnpm-lock.yamlestá emlockfileVersion: 9.0) - Rust estável
>= 1.77.2com as dependências do Tauri. No Linux:libwebkit2gtk-4.1-dev,libssl-dev,libayatana-appindicator3-dev,librsvg2-dev,patchelf - Ollama instalado e acessível em
http://localhost:11434(o app detecta quando não está e orienta a instalação) - Chrome ou Chromium instalado: a busca web usa navegador headless para raspagem
pnpm installO repositório já traz o pnpm-workspace.yaml com allowBuilds para sharp e unrs-resolver, necessário porque o pnpm 10+ bloqueia scripts de build de dependências por padrão.
Para desenvolver com a janela do app:
pnpm tauri devPara trabalhar apenas no frontend no navegador (porta 3000):
pnpm devAtenção: no navegador os comandos Tauri não existem, então a interface cai no estado "Ollama não encontrado". A aplicação completa só roda dentro da janela do Tauri.
Páginas da interface:
| Rota | O que faz |
|---|---|
/ |
Verifica o Ollama e oferece instalação guiada (macOS, Linux e Windows) |
/setup |
Seleciona GPU, escaneia hardware e recomenda modelos para baixar |
/chat |
Conversa com streaming, histórico com busca, fontes da pesquisa web e painel de MCP |
/tasks |
Cria e gerencia tarefas agendadas |
/settings |
Abas: Visão Geral, General, Web Search, Sources, Tasks e System |
Modelos: download com progresso (porcentagem, tamanho e velocidade), remoção e importação de arquivos GGUF locais. O catálogo de modelos recomendados está em lib/recommendation.ts.
Tarefas agendadas: cada tarefa tem um nome, uma expressão cron (a interface gera a expressão a partir de intervalo em horas ou horário diário) e um tipo de ação:
| Ação | O que executa |
|---|---|
SearchAndSummarize |
Pesquisa na web a partir de uma query, resume com o modelo escolhido e salva como conversa |
CustomPrompt |
Envia um prompt fixo para o modelo e salva a resposta |
JustPing |
Apenas dispara uma notificação do sistema |
MCP: os servidores são configurados em mcp_config.json, no diretório de dados do app, e podem ser iniciados, parados e inspecionados (ferramentas disponíveis) pela interface de chat.
pnpm build # export estático em out/ (usa webpack por causa do raw-loader de .md)
pnpm tauri build # compila o binário Rust e gera o bundle da plataformaO pnpm build sozinho gera apenas o frontend em out/. O artefato real é o bundle produzido pelo pnpm tauri build: MSI no Windows, DMG no macOS (arm64 e x64) e AppImage/deb no Linux, o mesmo conjunto que o workflow release.yml publica.
Para inspecionar o frontend de produção sem a janela do desktop, qualquer servidor estático serve:
python3 -m http.server --directory outAtualizações automáticas: o app consulta https://github.com/evandrodevbr/OllaHub/releases/latest/download/latest.json ao iniciar e a cada 6 horas, e usa a chave pública configurada em src-tauri/tauri.conf.json. Para assinar os artefatos, o repositório precisa do secret TAURI_UPDATER_PRIVATE_KEY com a chave privada do updater. O passo a passo está em docs/updater-setup.md.
app/ páginas (/, setup, chat, tasks, settings) e estilos globais
components/ UI em componentes: chat, settings, setup, modais e ui/ (shadcn)
hooks/ estado e integração com o Tauri (chat, tarefas, modelos, MCP, hardware)
lib/ pipeline de pesquisa: contexto, enriquecimento, condensação, relevância
services/ cliente de busca web e utilidades de resiliência
store/ estado global (zustand), incluindo a URL do Ollama
data/ catálogo de modelos (json) e prompts usados pelo pipeline
scripts/ geração de changelog e bump de versão
src-tauri/ backend Rust: db, scheduler, task_executor, web_scraper, embeddings e cia
src-tauri/scripts/ scraper de apoio em Python (ver limitações)
docs/ updater-setup.md e style-guide.md
Não existe suíte de testes automatizada neste repositório. O que foi verificado de fato na última revisão:
| Comando | Resultado |
|---|---|
pnpm install |
exit 0 (com o ajuste de allowBuilds no pnpm-workspace.yaml) |
pnpm exec tsc --noEmit |
0 erros de tipo |
pnpm build |
exit 0, 8 páginas estáticas geradas em out/ |
cargo check (em src-tauri/) |
exit 0, 17 avisos do compilador |
python3 -m http.server --directory out + Chrome headless |
HTTP 200 em /, /chat.html, /settings.html, /tasks.html, com a interface renderizada |
pnpm lint |
falha: 86 erros e 75 avisos pré-existentes no código (o eslint agora ignora src-tauri/target/, que gerava um erro extra de parsing) |
pnpm generate-changelog |
exit 0, 6 grupos e 29 commits no data/changelog.json |
O pnpm lint é o gate que ainda não passa. Os erros são regras de estilo (@typescript-eslint/no-explicit-any, no-require-imports, prefer-const) espalhadas pelo código, sem relação com o build.
- Sem testes automatizados e sem execução de lint no CI. O build (
next buildcom checagem de tipos) é o único gate real hoje. - Modo bandeja/segundo plano ainda não implementado: o
IMPLEMENTATION_GUIDE.mdlista o system tray como próximo passo, apesar da descrição do repositório citar o recurso. - O bootstrap de Python do frontend (
use-python-bootstrap) chama comandos que não existem no backend, esrc-tauri/scripts/scraper.pycomrequirements.txtnão é referenciado por nenhum código. data/models/*.json(188 arquivos com o catálogo da biblioteca do Ollama) não é lido por nenhum código; as recomendações vêm delib/recommendation.ts.- Várias chamadas do frontend fixam
http://localhost:11434mesmo existindo o campo de URL do Ollama nas configurações. - O workflow
release.ymlnunca concluiu com sucesso no histórico do repositório e não há releases publicadas; o updater só passa a ter efeito depois da primeira release. - Sem
LICENSEno repositório. - O monitor de GPU depende de
nvidia-smipara as métricas detalhadas; sem esse comando, só as informações básicas ficam disponíveis.
| Documento | Conteúdo |
|---|---|
docs/updater-setup.md |
Chaves de assinatura, secrets do GitHub e fluxo de atualização |
docs/style-guide.md |
Escala de espaçamento, raios, responsividade e acessibilidade da UI |
IMPLEMENTATION_GUIDE.md |
Registro da implementação de tarefas agendadas e do pendente de bandeja |
O repositório não possui arquivo de licença. Sem uma licença definida, o código permanece com todos os direitos reservados ao autor.