Official Paws for OpenVole β the microkernel AI agent framework.
npm install @openvole/paw-brain @openvole/paw-memory @openvole/paw-dashboardThen add to vole.config.json:
{
"brain": "@openvole/paw-brain",
"paws": [
{ "name": "@openvole/paw-brain", "allow": { "network": ["*"], "env": ["BRAIN_PROVIDER", "BRAIN_API_KEY", "BRAIN_MODEL", "OLLAMA_HOST", "OLLAMA_MODEL", "GEMINI_API_KEY", "GEMINI_MODEL"] } },
{ "name": "@openvole/paw-memory", "allow": { "network": ["*"], "env": ["VOLE_MEMORY_DIR", "OLLAMA_HOST"] } },
{ "name": "@openvole/paw-dashboard", "allow": { "listen": [3001] } }
]
}Several paws have built-in VoleNet support for distributed deployments:
- paw-dashboard β VoleNet panel showing connected peers, leader status, and remote tool execution feed
- paw-memory β Cross-peer memory sync (write propagation + remote search)
- paw-session β Session transcript replication across devices
Any paw's tools can be shared across VoleNet instances β remote tools appear in the coordinator's registry and work transparently.
When a Paw is loaded, its tools are registered into the Tool Registry β a flat list that the Brain sees alongside core tools and MCP tools. The Brain calls them by name without knowing which Paw provides them.
vole> summarize my unread emails
Brain sees:
email_search (paw-email) β searches inbox
email_read (paw-email) β reads each email
browser_navigate (paw-browser) β if needed
memory_write (paw-memory) β saves summary
You can also call any registered tool directly from the CLI β no Brain involved:
npx vole tool call email_search '{"query":"is:unread","limit":5}'
npx vole tool call github_create_issue '{"repo":"myorg/myrepo","title":"Bug","body":"..."}'
npx vole tool call calendar_list_events '{"days":7}'A Paw is a Node.js package that provides tools to the agent. See the Paw Development Guide in the main repo.
import { definePaw, z } from '@openvole/paw-sdk'
export default definePaw({
name: 'my-paw',
version: '0.1.0',
description: 'My custom paw',
tools: [
{
name: 'my_tool',
description: 'Does something useful',
parameters: z.object({ input: z.string() }),
execute: async ({ input }) => ({ result: input.toUpperCase() }),
},
],
})We welcome new Paws! See CONTRIBUTING.md for guidelines on creating and submitting Paws.
