HydraOps 发布自托管多智能体 AI 桌面应用
TraX22/HydraOps
HydraOps 发布自托管多智能体 AI 应用,提供 Windows 安装包和无头服务器两种形态,多个各自拥有性格、模型、工具和记忆的智能体可在聊天中并行处理研究、代码、图像和视频任务。
English | Español
🌐 hydraops.org · Download the latest release · X @HydraOpsApp
Self-hosted multi-agent AI for your own machine. A desktop app (Windows installer)
or a headless server, with a chat where several AI agents — each with its own
personality, model, tools and memory — work on tasks in parallel: research, code, images
and video. Bring your API keys or run local LLMs; talk to your agents from the app, from
Telegram, or with /commands.
Works with API models (OpenAI, Anthropic, Gemini, Groq, xAI, Mistral, DeepSeek, Qwen, Kimi, GLM, MiniMax, OpenRouter, Perplexity, Leonardo) and with local models through any OpenAI-compatible server — Ollama, llama.cpp, LM Studio, vLLM. Image and video engines: Leonardo, Google Imagen and Veo, xAI Grok Imagine.
Status: in real daily use on Windows (desktop installer) and in server mode (headless) — reachable from another machine's browser on your local network with a token, or run 24/7 via systemd (see Server mode). A container image is still on the way.
What you get
- Agents with personality. Each one is six Markdown files, editable from the interface itself: soul, skills, tools, memory, heartbeat and profile.
- Agents that remember. A permanent memory per agent (
remember) and full-text search over its past conversations (recall) — files and SQLite, no vector database. - Agents that delegate. An agent can hand a task to another one (
delegate_task), and every agent is told to say so when it lacks a tool instead of pretending. - Four worker types — code, general, image and video — each with its own engine and aspect ratio, configurable per agent. Video through Google Veo, xAI Grok Imagine or Leonardo Motion; images through Leonardo (Flux, Phoenix…), Google's Gemini image models or Grok.
- Tools. Native add-ons (web search, Brave, Perplexity,
fetch_urlwith RSS fallback, YouTube transcripts, GitHub, Telegram), your own add-ons inmy_addons/(hot-loaded) and MCP servers, local or remote. Each agent gets only the tools you grant it. - Connections. A catalog of MCP servers ready to install from the app — Blender, a real browser, a document converter — with the program's version pinned and every tool classified by what it does, so the ones that only read run freely.
- Skills. Tested procedures (the open Agent Skills format) that agents open when a task calls for one: install them from the catalog, copy your own, or let an agent propose one for your approval.
- Plan before doing.
/planputs an agent in a mode where it can only read: it proposes the steps, you approve, edit or ask for a revision, and only then does anything run. - Outside content is data, not orders. What an agent reads from the web is marked as third-party content, and once a task has read any, the actions that change something wait for your approval in the chat (or on Telegram); the agent picks up where it left off once you decide.
- Long reads without losing the thread. Long tool results are kept whole in a task vault; the agent reads them back by section or by search instead of working from a truncated first screen.
- Telegram bot. Pair a chat with a code and talk to any agent from your phone; scheduled tasks can push their results (and failures) to Telegram too.
- Commands. Type
/in the chat for a palette of verbs that cost no tokens —/agents,/use luna,/status,/delegate karen …,/remember,/recall— with Spanish aliases; the same commands work in Telegram. See Commands. - One Shot. Draw a task as a flow diagram of nodes and connections and have your model compile it into a single, complete prompt.
- 3D. Describe an object and a model writes the scene; it renders in an isolated
viewer, you iterate on it and export it as
.glbor a PNG. - Credential firewall. API keys are never in the repository, the database or the
.env: they live outside the project and a local proxy injects them at the network boundary. Workers only ever see theproxyplaceholder. - Tool guard. Every tool goes through a filter that blocks credential paths, catastrophic commands and requests to internal networks, and redacts secrets from results.
- Chat with attachments, inline images and video, Mermaid diagrams, per-message LLM and token cost, scheduled tasks with a schedule picker, statistics and an interface in five languages (es, en, it, fr, pt-BR).
Architecture
A pnpm monorepo in TypeScript ESM. The flow of a task:
UI (Angular) → API (Express) → SQLite outbox → outbox-worker → NATS JetStream
↓
result ← worker-{coder,general,graphic,video} ← orchestrator
No application publishes directly to NATS: everything writes to the outbox table and a
single process drains it, so a network failure never loses events. Consumers use
processed_events to stay idempotent.
| Path | What it is |
|---|---|
apps/api/ |
REST API and file server |
apps/orchestrator/ |
assigns each task to an agent |
apps/outbox-worker/ |
publishes the outbox to NATS |
apps/worker-*/ |
the four executors |
apps/key-proxy/ |
credential firewall |
apps/telegram-bot/ |
the Telegram transport |
apps/desktop/ |
Electron shell and packaging |
packages/ |
config, db, llm, addons, commands, events, nats |
ui/ |
Angular interface |
agents/ |
the example agent; the ones you create appear here too |
Documentation
The user manual lives in docs/ (Spanish and English) and is also available inside the application, in the Docs view.
Installation
Option A — Windows installer
Download the .exe from the Releases page. It needs no Node, no pnpm, and not this
repository: the services run on the Node bundled with Electron.
Your data goes to %APPDATA%\HydraOps\data and your keys to
%APPDATA%\hydraops\keys.json, outside the installation directory, so updating the
application never touches anything of yours.
Option B — from source
Requirements: Node 20+, pnpm 9 and the nats-server binary.
nats-server is required: it is the message bus between the API and the agents; without it the workers won't start. Download it from its releases for your system:
- Debian/Ubuntu: the
.debfor your architecture (…-amd64.debfor a 64-bit PC,…-arm64.debfor ARM) → double-click to install, orsudo dpkg -i nats-server-*-amd64.deb(or with apt, note the./:sudo apt install ./nats-server-*-amd64.deb; a bareapt install natswon't work).- Fedora/RHEL: the matching
.rpm→ double-click, orsudo rpm -i nats-server-*-amd64.rpm.- macOS:
brew install nats-server. Windows:choco install nats-server(the.exeinstaller already bundles it).Having the binary on your
PATH, in anats/folder inside the repo, or pointed to byNATS_SERVER_BINin the.envalso works. Check withnats-server --version.
pnpm install cp .env.example .env
Then start it with one of the modes below. Both pnpm serve and pnpm desktop build the
packages and the interface for you, so a fresh clone (or a git pull) is ready right away —
no separate build step to remember.
Server mode (headless)
For keeping it on 24/7 on a machine with no screen — a mini PC at home, for example. A single command brings up NATS and every service, without Electron:
pnpm serve
It applies migrations and seeds the database by itself (a first boot from a fresh clone
works with no prior steps), waits for each phase to be healthy, restarts anything that
crashes, and Ctrl+C (or systemd's SIGTERM) stops the whole stack. Logs go to the
console prefixed per service and are also kept in storage/logs/.
To open it to your local network, set HYDRA_HOST=0.0.0.0 and a HYDRA_AUTH_TOKEN in
the .env (see Security); the output of pnpm serve itself will print the
URLs. Without a token, the API stays on loopback.
To have it start on boot there is a systemd unit ready in
deploy/hydraops.service, with the installation instructions
inside; the logs of every service end up in the journal (journalctl -u hydraops -f).
Desktop mode
The Electron window, with splash screen and supervisor built in:
pnpm desktop # builds packages + interface and opens the application pnpm desktop:quick # skip the build (faster relaunch)
Development mode
With hot reload:
pnpm dev # the services in watch mode pnpm --filter ui start # the interface, separately, on 4200
Building the installer
pnpm build # packages first: everything else consumes their dist/, not the source pnpm desktop:dist # interface + self-contained backend + NSIS installer
The result lands in apps/desktop/release/. Close the application first: the installer
cannot overwrite files in use.
Publishing a release
Pushing a v* tag triggers .github/workflows/release.yml:
a Windows runner builds the installer and uploads it — with the latest.yml metadata
that auto-update relies on — to a GitHub Release. To cut one:
# bump the version in apps/desktop/package.json (e.g. 0.1.1), then: git commit -am "Release 0.1.1" git tag v0.1.1 git push origin main --tags
The tag must match the version in apps/desktop/package.json. Installed desktop apps
check that Release on startup, download a newer version in the background and offer to
restart. The installer isn't signed yet, so the first install shows a SmartScreen
warning (auto-updates verify by hash, not signature). Server (headless) deployments don't
use this — they update with git pull (see Server mode).
Configuration
API keys are set from the application's Settings view, not in files. The .env only
holds infrastructure and the local model; see .env.example, which explains every
variable.
The three local-model settings (LOCAL_LLM_URL, LOCAL_LLM_KEY, LOCAL_LLM_MODEL)
live only in the .env on purpose, and the workers re-read it on every task: you can
switch local servers without restarting anything.
Security
Four things already taken care of:
- API keys never leave the firewall. They live outside the project and the key-proxy
injects them at the network boundary: neither the workers, nor the database, nor the
.envever see a real key. - Every tool goes through a guard that blocks credential paths and destructive
commands, redacts secrets from results, and keeps
fetch_urlaway from internal addresses. - The API listens only on
127.0.0.1. Out of the box it is not reachable from another machine. - Opening it to the network requires a token. With
HYDRA_HOST=0.0.0.0the API demands aHYDRA_AUTH_TOKEN: the browser asks for it once (login screen), and with no token defined the API simply refuses to open up. Connections from the machine itself don't need it.
One limit worth knowing: the token travels in the clear over HTTP, so it is meant for
your local network, not for exposing the port to the internet. If you ever want access
from outside your home, put it behind HTTPS (a reverse proxy with a certificate, or a VPN
like WireGuard or Tailscale) — and with a reverse proxy in front, enable
HYDRA_AUTH_STRICT=1 so the token is required on those connections too.
To report a vulnerability, see SECURITY.md or write to security@hydraops.org.
Privacy
HydraOps runs entirely on your machine and collects no data of its own — see the Privacy Policy.
Contact
Questions, ideas, anything: hi@hydraops.org — or open an issue.
Follow the project on X: @HydraOpsApp.
HydraOps integrates with GitHub through its API (the github add-on: repositories, issues and pull requests) and is a member of the GitHub Developer Program. Support for the integration: hi@hydraops.org.
License
来源:GitHub · github.com
