A self-hosted AI agent server with a native-app protocol and a human trust gate for self-extension. Everything runs on hardware you own — any OpenAI-compatible model, memory as plain markdown in your Obsidian vault, no cloud, no telemetry.
| Component | Repo | What it is |
|---|---|---|
| Setup | setup |
One command that installs the server and the desktop app, and proves it works |
| Server | server |
The agent: Pydantic AI core, capability registry, memory pipeline, web search, loops / delegation / cron, skills with an approval gate, AG-UI + REST device protocol |
| Desktop | desktop |
Electron client for macOS, Windows, and Linux |
| iOS | coming soon | SwiftUI client for iPhone and iPad |
| Capabilities | capabilities |
Optional plugins: weather, YouTube, diagrams, GitHub, code repos, Apple integrations, budgets, travel |
Three paths to the same server. All you need first is a model endpoint that calls tools reliably — roughly 20B+, via Ollama, llama.cpp, vLLM, LM Studio, or anything speaking the OpenAI API. Smaller models fail at tool calling in ways that look like bugs, so every path checks this for you before you find out the hard way.
Installs the server, builds and pairs the desktop app, and finishes by asking the agent for a joke. Safe to re-run.
git clone https://github.com/vaelkeep/setup.git vaelkeep && cd vaelkeep
./install.shNo Python toolchain, and the way to run the server on Windows. Self-hosted search is an optional profile.
git clone https://github.com/vaelkeep/server.git && cd server
cp .env.example .env # set LLM_BASE_URL / LLM_MODEL
docker compose up -d --build # server only
docker compose --profile search up -d --build # server + SearXNGFor macOS, where the Apple capability plugins need to run outside a container.
git clone https://github.com/vaelkeep/server.git && cd server
uv sync && cp .env.example .env
uv run vaelkeep doctor # endpoint, model, tool calling, persona
uv run vaelkeep serveGrab Vaelkeep Desktop for macOS, Windows, or Linux — or build it from source. Pair it with a code from vaelkeep pair --host <reachable-host>, or hand it VAELKEEP_SERVER_URL and VAELKEEP_DEVICE_TOKEN and it configures itself.
When something is wrong, ask. vaelkeep doctor checks the endpoint, compares the model you configured against what your endpoint actually serves, confirms the model can call tools, and reports what it finds. It exits non-zero, so scripts and CI can gate on it.
Vaelkeep doesn't live inside Telegram or Slack. Clients pair with your server once and speak an open, documented protocol — AG-UI streaming for turns, REST for pairing, rotating refresh tokens, cross-device sync, push, and approval prompts.
![]() |
![]() |
Vaelkeep Desktop and the Vaelkeep iOS app (coming soon), both paired to one server.
The agent writes its own skills in the open agentskills.io format — but nothing runs unrestricted until it has passed a recorded test, been submitted under a content hash, and been approved by you, out of band, never through the model.
Everything inside the dashed boundary runs on one machine. Only Apple push (optional) leaves it.
- Add plugins —
uv add "vaelkeep-capabilities[all] @ git+https://github.com/vaelkeep/capabilities", thenvaelkeep capabilities list. - Build your own client —
docs/client-guide.mdis written so you can hand it to a coding agent and get a working client back. - Make it yours — persona files, private capabilities, and a git-tracked skills folder: Your Own Vaelkeep.
Self-hosted agents with memory and skills are no longer rare. Vaelkeep's choices: an app, not a bot (owned clients over an open protocol instead of messaging gateways); self-extension you approve; memory you can open in Obsidian; and a small, typed core tuned for local models. Full comparison in the server README.
Built by Rod Moore at CoreAutomation LLC · MIT licensed




