Drop a folder of markdown files, get a chat agent with a polished web UI.
Project description
Drop a folder of markdown files. Get a chat agent with a polished web UI.
hubzoid reads AGENTS.md, agents/, skills/, and knowledge/ from a folder
and turns it into a running AI agent. Backed by the OpenAI Agents
SDK or the Claude Agent
SDK, served over an
OpenAI-compatible HTTP API, and chattable through a bundled
Open WebUI front end.
You write the markdown. hubzoid handles the runtime, the API, the UI, the streaming, and the sub-agent routing. Provider-agnostic via LiteLLM: OpenRouter, OpenAI, Anthropic, and local Claude work out of the box.
Quickstart
3 steps if you have claude CLI installed and logged in, 4 otherwise.
pip install hubzoid
hubzoid init demo-hub # scaffolds a starter hub + agents-repo wrapper
* edit demo-hub/.env # ← optional. skip if using claude-local.
hubzoid run demo-hub
Open http://localhost:3080. The scaffolded demo-hub is a working Hubzoid
Guide agent.
* Step 3 (the optional one). Default MODEL=claude-local uses your
installed claude CLI subscription. If you already ran claude login,
skip this step and go straight to hubzoid run. Otherwise, open
demo-hub/.env, comment out the MODEL=claude-local line, and uncomment
one of the provider stanzas (OpenRouter, OpenAI, Anthropic) with your key
pasted in.
The two files you edit later as you customize:
demo-hub/.env: keys, model selection, UI knobs.demo-hub/AGENTS.md: the system prompt body. YAML frontmatter setsname,description, and optionalmodel.
How it works
┌─────────────────────────────┐
│ Open WebUI │ http://localhost:3080
│ (web chat, white-label) │
└──────────────┬──────────────┘
│ OpenAI-compatible HTTP
┌──────────────┴──────────────┐
│ FastAPI bridge │ /v1/chat/completions /v1/models
└──────────────┬──────────────┘
│ in-process
┌──────────────┴──────────────┐
│ Agent runtime │ OpenAI Agents SDK | Claude Agent SDK
└──────────────┬──────────────┘
│ LiteLLM (or claude CLI subprocess)
┌──────────────┴──────────────┐
│ Your model │ OpenRouter · OpenAI · Anthropic · claude-local
└─────────────────────────────┘
One install command. Open WebUI, the Claude Agent SDK, the OpenAI Agents SDK, LiteLLM, and FastAPI are all bundled as required dependencies. No optional extras for the runtime.
A minimal AGENTS.md
---
name: code-reviewer
description: Reviews a code diff. Ranks the top three issues by severity.
model: openrouter/anthropic/claude-haiku-4.5
---
You review code. When the user pastes a diff or a file, identify the top
three issues ranked by severity: correctness first, then security, then
readability.
For each issue, cite the line number and explain the fix in one sentence.
Skip style nits unless the user asks for them. If the code looks clean,
say so in one line and stop.
That is the whole hub. One file. No sub-agents, no skills, no knowledge
needed. Drop it in a folder, run hubzoid run ., and you have a code
reviewer at http://localhost:3080.
Editing your hub
Your hub is one folder. Six things to know.
- Pick your model. Default
.envusesMODEL=claude-local(no key needed ifclaude loginis done). To switch to OpenRouter / OpenAI / Anthropic, uncomment a stanza in.envand paste a key. - Write the main agent. Open
AGENTS.md. The body is the system prompt. YAML frontmatter setsname,description, and optionalmodel. - Sub-agents. One folder per sub-agent under
agents/. Each has its ownAGENTS.md. Frontmattertools: [...]whitelists which tools the sub-agent may call. - Skills. One folder per playbook under
skills/, each with aSKILL.md. The main agent loads them on demand viaload_skill(name). - Knowledge. One markdown file per topic under
knowledge/. Reached viaread_knowledge(name). - Tools and connectors. Drop Python files with
@function_toolintools_local/. Editconnectors/.mcp.jsonto plug in MCP servers.
Folder names are case- and plural-flexible. skills/, Skills/, and
skill/ all work. Same for agents/, knowledge/, tools_local/,
connectors/. Restart with the same command. Changes are picked up on
the next start.
Multi-hub agents repo
Run hubzoid init more than once in the same directory and you get a
Samarth-style multi-hub layout with one parent requirements.txt:
mkdir my-agents && cd my-agents
hubzoid init devops-agent # creates ./devops-agent + ./requirements.txt + ./.gitignore + ./README.md
hubzoid init support-agent # creates ./support-agent only; parent files left alone
hubzoid init research-agent # creates ./research-agent only
Each hub is independent: its own .env, its own port, its own user
database. The parent files are written only on the first init in a
fresh directory (empty or containing only dotfiles / README /
requirements.txt / LICENSE). Idempotent and non-destructive afterward.
Providers
Pick one stanza in .env. See docs/providers.md for
more detail.
# OpenRouter (one key, many models)
OPENROUTER_API_KEY=sk-or-v1-...
MODEL=openrouter/anthropic/claude-haiku-4.5
# OR OpenAI
OPENAI_API_KEY=sk-...
MODEL=openai/gpt-4o-mini
# OR Anthropic
ANTHROPIC_API_KEY=sk-ant-...
MODEL=anthropic/claude-haiku-4-5
# OR Claude local (uses your installed `claude` CLI + Pro/Max subscription)
# Requires `claude login` first. No API key needed.
MODEL=claude-local
# MODEL=claude-local/sonnet # pin Sonnet
# MODEL=claude-local/opus # pin Opus
# MODEL=claude-local/haiku # pin Haiku
The MODEL string tells LiteLLM which provider to call, and the matching
key must be set. The exception is MODEL=claude-local: instead of
LiteLLM, hubzoid drives the Claude Agent SDK against your locally
installed claude CLI, so auth and billing flow through your existing
Pro/Max subscription. Same hub folder, same tools, same skills. Only the
LLM and auth path differ.
Pre-shipped tools
Every hub gets these tools for free.
| Tool | What it does |
|---|---|
read_file(path) |
Read a file under the hub directory. |
list_files(glob) |
List files matching a glob. |
write_artifact(filename, content) |
Write a file under output/<session>/. |
list_skills() |
Menu of skills in the hub. |
load_skill(name) |
Read a skill's full body on demand. |
list_knowledge() |
Menu of knowledge documents. |
read_knowledge(name) |
Read a knowledge document's full body. |
remember(fact, scope) |
Save a fact to durable memory. |
recall(query, scope) |
Look up saved facts. |
forget(id, scope) |
Delete a saved fact. |
render_jinja(template, context_json) |
Render a Jinja2 template. |
http_get(url) |
Fetch a URL (honors HTTP_ALLOWLIST). |
web_search(query) |
DuckDuckGo search. No API key. |
Custom tools dropped into tools_local/*.py are auto-discovered.
MCP connectors
MCP connectors are per-hub. Each hub has its own
<hub>/connectors/.mcp.json alongside its AGENTS.md. Two hubs in the
same agents-repo connect to completely different MCP servers because each
loads its own config independently. There is no parent-level shared MCP
file by design: agents are independent products with their own scope.
Edit demo-hub/connectors/.mcp.json (or whatever your hub is named):
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["@modelcontextprotocol/server-filesystem", "./workspace"]
},
"github": {
"command": "npx",
"args": ["@modelcontextprotocol/server-github"],
"env": {"GITHUB_PERSONAL_ACCESS_TOKEN": "${GH_TOKEN}"}
}
}
}
${VAR} references in any string field resolve against the environment at
boot. The same .mcp.json is honored by both the OpenAI Agents and
Claude Agent runtimes.
CLI
hubzoid init [NAME] Scaffold a new hub folder under the current directory.
NAME defaults to "demo-hub".
Also drops requirements.txt / .gitignore / README.md
at the parent on first run if the directory looks fresh.
hubzoid run [PATH] Start the FastAPI bridge plus Open WebUI for a hub.
--port INT Open WebUI port (default 3080).
--bridge-port INT FastAPI bridge port (default 8000).
--no-ui Bridge only, no Open WebUI.
hubzoid doctor [PATH] Validate hub config and report issues.
hubzoid test [PATH] Send one prompt to the agent and print the response.
hubzoid version
hubzoid --help
PATH defaults to . for run / doctor / test. python -m hubzoid ... also
works as an alternative invocation.
Run from source
For contributors or anyone who wants to read or extend the framework code.
git clone https://github.com/hubzoid/hubzoid.git
cd hubzoid
python -m venv .venv && source .venv/bin/activate
pip install -e '.[dev]'
hubzoid run demo-hub
The repo ships with demo-hub/ at the root as a working starter. Its
.env is git-ignored but the template includes sensible defaults
(MODEL=claude-local).
Open standards
| Spec | Used at |
|---|---|
| AGENTS.md | <hub>/AGENTS.md, <hub>/agents/<n>/AGENTS.md |
| SKILL.md | <hub>/skills/<n>/SKILL.md |
| MCP | <hub>/connectors/.mcp.json |
Hubs are portable across any tool that adopts these specs (Claude Code, Cursor, Codex, Copilot, Gemini CLI, VS Code).
Roadmap
- v0.2 Current. PyPI release with bundled Open WebUI + Claude Agent SDK; OpenAI Agents and Claude Agent runtimes; AGENTS.md, SKILL.md, MCP loaders; OpenRouter, OpenAI, Anthropic, claude-local providers.
- v0.3 Per-hub branding, auth-on path, native-venv production deployment docs, Playwright UI test tier.
- v0.4 Background and scheduled workflows via WaveAssist Cloud (separate product, opt-in).
- Later Slack and Telegram chat surfaces. Mem0 / Zep memory backends.
Non-goals: voice and realtime, visual agent builder.
Hubzoid as a service
This is the open-source framework. hubzoid.com is the consulting practice that deploys role-scoped hubs for mid-enterprise organizations in six weeks, fixed scope, fixed price. The framework is the substrate; the practice ships the deployment.
Contributing
See CONTRIBUTING.md. Issues and PRs welcome.
License
MIT.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hubzoid-0.2.3.tar.gz.
File metadata
- Download URL: hubzoid-0.2.3.tar.gz
- Upload date:
- Size: 57.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2e1d7c67d0a031ca3e0474a49c0b779d405ec09d22bd3733838c993d4997a4c1
|
|
| MD5 |
f340fd6a727639b1ec38b66bcd5a12a5
|
|
| BLAKE2b-256 |
1da58d2247b18e4fde69fb79501f99cc8f5b241805f2572323b9d2915db2bc1b
|
Provenance
The following attestation bundles were made for hubzoid-0.2.3.tar.gz:
Publisher:
ci.yml on hubzoid/hubzoid
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hubzoid-0.2.3.tar.gz -
Subject digest:
2e1d7c67d0a031ca3e0474a49c0b779d405ec09d22bd3733838c993d4997a4c1 - Sigstore transparency entry: 1568331585
- Sigstore integration time:
-
Permalink:
hubzoid/hubzoid@e14cb8b963a07007513d964c459ecd259b15bd54 -
Branch / Tag:
refs/tags/v0.2.3 - Owner: https://github.com/hubzoid
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@e14cb8b963a07007513d964c459ecd259b15bd54 -
Trigger Event:
release
-
Statement type:
File details
Details for the file hubzoid-0.2.3-py3-none-any.whl.
File metadata
- Download URL: hubzoid-0.2.3-py3-none-any.whl
- Upload date:
- Size: 63.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
caf0ee6af6b9d3c687bd2ccea261a90caec0b71dffaf77a3cd01e15ee17e0447
|
|
| MD5 |
3eb861d9ccb43291da2d1ca3ad9f4f55
|
|
| BLAKE2b-256 |
35ea61bcb701b423f0afb06e629a868b34bb83395a2a0ae0faab632a33cab9dc
|
Provenance
The following attestation bundles were made for hubzoid-0.2.3-py3-none-any.whl:
Publisher:
ci.yml on hubzoid/hubzoid
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hubzoid-0.2.3-py3-none-any.whl -
Subject digest:
caf0ee6af6b9d3c687bd2ccea261a90caec0b71dffaf77a3cd01e15ee17e0447 - Sigstore transparency entry: 1568331704
- Sigstore integration time:
-
Permalink:
hubzoid/hubzoid@e14cb8b963a07007513d964c459ecd259b15bd54 -
Branch / Tag:
refs/tags/v0.2.3 - Owner: https://github.com/hubzoid
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@e14cb8b963a07007513d964c459ecd259b15bd54 -
Trigger Event:
release
-
Statement type: