Skip to content

Repository files navigation

OllaHub

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.

Tauri Next.js React TypeScript Rust Node Build and Release

Sobre

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.

Como funciona

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.

Stack

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

Requisitos

  • Node.js >= 20.9 (exigido pelo Next 16)
  • pnpm >= 9 (o pnpm-lock.yaml está em lockfileVersion: 9.0)
  • Rust estável >= 1.77.2 com 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

Início rápido

pnpm install

O 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 dev

Para trabalhar apenas no frontend no navegador (porta 3000):

pnpm dev

Atençã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.

Uso

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.

Produção

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 plataforma

O 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 out

Atualizaçõ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.

Estrutura do projeto

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

Verificação

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.

Estado atual e limitações

  • Sem testes automatizados e sem execução de lint no CI. O build (next build com checagem de tipos) é o único gate real hoje.
  • Modo bandeja/segundo plano ainda não implementado: o IMPLEMENTATION_GUIDE.md lista 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, e src-tauri/scripts/scraper.py com requirements.txt nã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 de lib/recommendation.ts.
  • Várias chamadas do frontend fixam http://localhost:11434 mesmo existindo o campo de URL do Ollama nas configurações.
  • O workflow release.yml nunca 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 LICENSE no repositório.
  • O monitor de GPU depende de nvidia-smi para as métricas detalhadas; sem esse comando, só as informações básicas ficam disponíveis.

Documentação

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

Licença

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.

About

🦙 Desktop app to manage local Ollama models — chat sessions, cron-based task scheduling, and background mode with system tray. Built with Tauri v2 + Next.js + TypeScript.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages