Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Veyllo

An autonomous agent framework built on top of local and cloud LLMs. VAF runs as a desktop application, a headless server, or a terminal interface on Windows, macOS, and Linux.

Installation · Build on VAF · Documentation · Contributing

VAF - Veyllo Agentic Framework. The open-source AI agent framework and harness with persistent memory and tools for web, code and files - fully self-sufficient in-house, or with models from the cloud. Below the title, the desktop window in front and the full-screen terminal app behind it.

CI Latest release Last commit Stars

Lines of code Tools Tests LLM providers Platforms

Local models No telemetry Python License: AGPL v3 Commercial license

Dual-licensed: free under the GNU AGPL-3.0, or a commercial license for proprietary/SaaS use without copyleft (legal@veyllo.io).

Requires: Git to clone, and a container runtime. VAF keeps users, auth, setup and memory in a PostgreSQL/pgvector container, so one is required to finish setup and sign in. All three installers set the engine up for you: Windows installs the free Rancher Desktop, macOS auto-installs the free Colima (or uses Docker Desktop if present), and Linux auto-installs your distro's Docker (systemd + docker group). The installer also provisions Python and Node itself.


Start here

Pick your path:

You want to… Go to
Run VAF as a desktop app, server, or terminal Installation below
Build on VAF as a library (embed the agent in your app) docs/EMBEDDING.md · docs/ARCHITECTURE.md
Write a tool (extend the agent, ship it as a pip package) vaf/tools/README.md · docs/EMBEDDING.md
Contribute to the engine (the core agent loop) vaf/core/README.md · docs/ARCHITECTURE.md

Use it as a library

pip install --pre vaf
import os

from vaf import Agent

agent = Agent(config={"provider": "openai", "api_key_openai": os.environ["OPENAI_API_KEY"]})
print(agent.run("In one short sentence, what is Python?"))

The same code runs on a fully local GGUF model (provider="local" - no key, nothing leaves the machine) or any supported API provider (veyllo, openai, anthropic, google, deepseek, openrouter). The base install is slim; heavy features are opt-in extras like vaf[memory] and vaf[server]. Developer guide: docs/EMBEDDING.md · runnable examples: examples/


The same agent in two places: the full-screen terminal app and the web UI, split down the middle

One agent, one session store, one config - in your terminal or in your browser.


Installation

Windows:

git clone https://github.com/Veyllo-Labs/VAF.git
cd VAF
.\install.bat

macOS / Linux:

git clone https://github.com/Veyllo-Labs/VAF.git && cd VAF
chmod +x install.sh && ./install.sh

The installer sets up a Python venv, installs all dependencies, prepares the web UI (built on first launch), sets up a container engine for you (Rancher Desktop on Windows, Colima on macOS, your distro's Docker on Linux, or uses an existing one if present), and adds the vaf command to your shell.

New to this, or never used git/a terminal? Follow the step-by-step Installation Guide. It covers installing git, where to put the folder, running the installer without admin, and troubleshooting.

On Linux, the installer asks once which installation mode to use (macOS and Windows always install Desktop mode):

[1] Desktop  - personal use, local only, system tray (default)
[2] Server   - always-on service, LAN accessible via HTTPS, starts at boot

Choose [2] Server for home servers, NAS devices, or any headless machine that should be reachable from other devices. See docs/setup/SERVER_MODE.md for details.


Quickstart

Confirm the install works with a one-shot prompt:

vaf prompt "Hello"

Then launch the desktop app (system tray + web UI at http://localhost:3000) with vaf tray, or start an interactive terminal chat with vaf run. See Modes for all the ways to run VAF.


Updating

VAF updates in place to the latest published release:

vaf update           # Stop, fetch the latest release, reinstall, migrate, restart
vaf update check     # Check whether a newer version is available

vaf update only proceeds from a clean checkout, records a rollback point, and reverts automatically if any step fails. A one-line "update available" hint appears at startup (disable via update_check_on_start in config.json). Maintainers cutting releases: see docs/setup/RELEASING.md.


Modes

VAF runs in three modes depending on your use case.

Desktop (recommended for personal use)

The VAF desktop window: conversation list on the left, the agent's mark, and a prompt

The desktop app: system-tray icon + agent window, web UI at http://localhost:3000. Easiest start: double-click the VAF Agent shortcut the installer created, or run:

vaf tray       # Start the desktop app (tray + web UI)

Or manage it as a background service:

vaf start      # Start in background
vaf stop       # Stop cleanly
vaf restart    # Restart
vaf status     # Show status

LAN access (other devices on your network):

vaf server on      # Bind to 0.0.0.0 with HTTPS
vaf server off     # Back to localhost only
vaf server status  # Show active URLs

Server (always-on, starts at boot)

Installed via the [2] Server option. VAF runs as a systemd user service. Use the same commands:

vaf start      # systemctl --user start vaf
vaf stop       # systemctl --user stop vaf
vaf restart    # systemctl --user restart vaf
vaf status     # systemctl --user status vaf

LAN access (HTTPS on port 8443) is always enabled and locked in server mode. See docs/setup/SERVER_MODE.md.

Terminal (CLI)

The full-screen terminal app with the sessions panel open: every conversation, walkable, enter loads

Interactive chat in the terminal with themes, session management, and streaming output.

vaf run                        # Start interactive chat
vaf run --session <id>         # Resume a saved session
vaf run --classic              # Minimal interface (SSH / low-bandwidth)
vaf run --no-web               # Skip starting the web UI

One-shot (non-interactive):

vaf prompt "Explain async/await in Python"
vaf prompt "List modified files" --output-format json

Web UI only

If you want the web interface without the tray:

vaf run --web

Models

VAF works with local GGUF models and cloud APIs. On first start it downloads the default model and the llama-server backend automatically.

Local (privacy-first):

  • Any GGUF model (Llama 3, Mistral, Qwen, DeepSeek, etc.)
  • GPU acceleration: CUDA on Windows, Vulkan on Linux, Metal on macOS
  • Minimum context: 32 768 tokens (enforced; required for tool use)

Cloud APIs:

  • Veyllo
  • OpenAI
  • Anthropic
  • Google
  • DeepSeek
  • OpenRouter (100+ models)

Switch provider or model at runtime: press C in the chat, or use /model <name>.


Features

Agent & Tools

  • 100+ built-in tools: web search, file system, bash, Python execution, calendar, email, GitHub, and more
  • Sub-agents for long-running tasks: Coder, Researcher, Librarian
  • Docker sandboxing for untrusted code execution
  • Scheduled automations (daily news, reminders, reports)

Memory

  • Persistent long-term memory with semantic search (pgvector + Redis)
  • Auto-compression when context fills up; full history archived and restorable
  • Memory graph visualization in the web UI

Sessions & History

  • Named sessions, saved and searchable
  • Git-based snapshot/undo for code changes
  • Export sessions to Markdown

Integrations

  • Telegram, Discord, WhatsApp (bridge mode)
  • Google Calendar, Gmail, Google Drive
  • GitHub

Developer

  • Plugin system: drop a BaseTool subclass into vaf/tools/, auto-discovered at startup
  • Custom workflows: place a WORKFLOW dict in ~/.vaf/workflows/*.py, auto-loaded
  • MCP (Model Context Protocol) client support

CLI Reference

vaf start            # Start background service (or: systemctl in server mode)
vaf stop             # Stop background service
vaf restart          # Restart background service
vaf status           # Show service status

vaf run              # Interactive chat (TUI)
vaf prompt "..."     # One-shot prompt
vaf tray             # Background service + web UI (foreground)
vaf server on|off|status

vaf update           # Update to the latest release
vaf update check     # Check if a newer release is available

vaf session list|load|delete|export|search
vaf snapshot create|list|restore|undo
vaf automation list|create|run|enable|disable|delete

vaf scaffold new <template> <name>   # Project templates
vaf generate api|function|class|test|component
vaf automate test|build|lint|format|check
vaf debug explain|trace|fix
vaf git commit --auto

vaf models list|set
vaf theme <name>
vaf install-gpu      # Re-detect and install GPU backend
vaf info             # System info
vaf --version

Configuration

All user data lives in ~/.vaf/:

~/.vaf/
├── config.json        # Settings (provider, model, n_ctx, ...)
├── sessions/          # Saved conversations
├── context_archive/   # Compressed conversation history
├── snapshots/         # Code undo history
├── automations/       # Scheduled tasks
└── workflows/         # Custom workflow plugins (*.py)

Key config options (config.json):

Key Default Description
provider local local, veyllo, openai, anthropic, google, deepseek, openrouter
n_ctx 32768 Context window (minimum 32 768 for tool use)
gpu_layers 99 Layers to offload to GPU (0 = CPU only)
web_ui_enabled true Start web UI alongside the agent
persist_server false Keep llama-server running after VAF exits

What VAF sends, and where

VAF collects no usage data and reports nothing to Veyllo. There is no analytics SDK, no crash reporter, and no identifier tied to you or your installation. Your conversations, memory, credentials and files stay in ~/.vaf/ and in your own database container.

By default VAF makes exactly one outbound request of its own: a version check against the public GitHub releases API at startup, so it can print a one-line "update available" hint. It sends no data about you or your usage - GitHub sees the request the way it sees any anonymous API call. Turn it off with update_check_on_start: false.

Everything else that leaves your machine is something you configured, and it goes to that provider, not to us:

If you configure... Then this goes there
provider: local nothing - the model runs on your machine
A cloud provider (openai, anthropic, google, deepseek, openrouter, veyllo) your prompts and tool results, to that provider
Web search, mail, calendar, messaging integrations the requests those features make, to those services

So "no telemetry" means what it says: we receive nothing. It does not mean an agent you point at a cloud model works without talking to that cloud.


Extending VAF

Custom tool - create vaf/tools/my_tool.py:

from vaf.tools.base import BaseTool

class MyTool(BaseTool):
    name = "my_tool"
    description = "One-line description the agent uses to decide when to call this."
    parameters = {
        "type": "object",
        "properties": {
            "query": {"type": "string"}
        },
        "required": ["query"]
    }

    def run(self, **kwargs) -> str:
        return f"result for {kwargs['query']}"

Custom workflow - create ~/.vaf/workflows/my_workflow.py:

WORKFLOW = {
    "name": "My Workflow",
    "triggers": ["my keyword"],
    "variables": {"topic": "What to process"},
    "steps": [
        {"tool": "web_search", "input": "{topic}", "output": "results"},
        {"tool": "coding_agent", "input": "Based on {results}, write code for {topic}", "output": "code"},
    ],
}

Both are auto-discovered at startup, no registration needed.


Platform Notes

Windows macOS Linux
Desktop mode Tray icon Menu bar icon Headless (no icon)
GPU backend CUDA Metal Vulkan
Web UI localhost:3000 localhost:3000 localhost:3000
Install install.bat install.sh install.sh

Linux headless mode requires no display server. See docs/setup/LINUX_SETUP.md for details.


Documentation

Topic Doc
Build on VAF (embed as a library) docs/EMBEDDING.md
Runnable examples (quickstart, events, custom tool) examples/
FAQ for developers docs/FAQ.md
Architecture (framework vs. harness) docs/ARCHITECTURE.md
Configuration reference (all config keys) docs/setup/CONFIG_SCHEMA.md
Engine reference (CoreAgent contracts) docs/CORE_AGENT.md
Observability (events, NDJSON scripting) docs/OBSERVABILITY.md
Debugging & logging docs/DEBUGGING.md
Write a tool (BaseTool, pip packaging) vaf/tools/README.md
Server mode (LAN, autostart) docs/setup/SERVER_MODE.md
Linux setup & GPU docs/setup/LINUX_SETUP.md
LLM backend (local vs API) docs/llm/PROVIDER_MODES.md
Voice agent (live call) docs/agents/VOICE_AGENT.md
Memory system docs/memory/MEMORY_SYSTEM.md
Web UI & API reference docs/web-ui/WEB_UI.md
Context management docs/memory/CONTEXT_MANAGEMENT.md
Automations docs/platform/AUTOMATIONS.md
Docker services docs/setup/DOCKER_SERVICES.md
Telegram / Discord / WhatsApp docs/integrations/TELEGRAM_INTEGRATION.md
Workflows vaf/workflows/README.md

License

License: AGPL v3 Commercial license

VAF is dual-licensed:

  • Open source - GNU AGPL-3.0-or-later: free to use, modify, and distribute. If you distribute VAF or run a modified version as a network service (SaaS), you must make your source available under the AGPL. Unmodified internal use (even commercial) triggers no disclosure. Building Plugins, Tools, and Workflows on top of VAF is explicitly permitted (Section 7 additional permission).
  • Commercial license: for embedding VAF in a closed-source product or running a proprietary SaaS without AGPL copyleft. See COMMERCIAL.md.

See LICENSING.md for the full dual-licensing explanation (English & German) and how to choose.

Legal notice: under Section 7(b) of the AGPL, VAF carries a short legal notice stating its origin and the obligations the AGPL imposes. Forks must keep this notice in their source code; it never has to be displayed to end users.

This notice adds no restrictions of its own - it restates the AGPL, and the AGPL still applies in full: if you run a modified version of VAF as a network service, you owe that service's users your complete source code (Section 13).

The commercial license is exactly what removes this obligation. See the "Preservation of Legal Notices" section in LICENSING.md.

Trademarks & brand: "VAF", "Veyllo", the VAF logo, and the agent avatar (the living-dot visual identity and its animated states) are trademarks and brand assets of Veyllo GmbH and are not covered by the code license. See the "Trademarks and Brand Assets" section in LICENSING.md.

For commercial and OEM licensing, contact legal@veyllo.io · https://veyllo.io.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vaf-0.1.0a21.tar.gz (5.1 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

vaf-0.1.0a21-py3-none-any.whl (4.5 MB view details)

Uploaded Python 3

File details

Details for the file vaf-0.1.0a21.tar.gz.

File metadata

  • Download URL: vaf-0.1.0a21.tar.gz
  • Upload date:
  • Size: 5.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for vaf-0.1.0a21.tar.gz
Algorithm Hash digest
SHA256 59b166e2b8f85d536e67c65e55d152be9e542a5cd4d92493af294862d252df97
MD5 40cd3104ac675971e3d0a9882c4503b8
BLAKE2b-256 3bc37e203cd30d0333a7e8d1e80815fea6351684c90bad4dacc524e4aed5cd3f

See more details on using hashes here.

Provenance

The following attestation bundles were made for vaf-0.1.0a21.tar.gz:

Publisher: release.yml on Veyllo-Labs/VAF

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vaf-0.1.0a21-py3-none-any.whl.

File metadata

  • Download URL: vaf-0.1.0a21-py3-none-any.whl
  • Upload date:
  • Size: 4.5 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for vaf-0.1.0a21-py3-none-any.whl
Algorithm Hash digest
SHA256 51a09d4892092ea2e2d19f985f2034838817d2248e220a301136e196d846c810
MD5 47d36afba1fd46971da6225780ed9ae6
BLAKE2b-256 c0a5ff0aa39087d33ed3abd973a86de387cb099dd7aea14a887961c6b744021f

See more details on using hashes here.

Provenance

The following attestation bundles were made for vaf-0.1.0a21-py3-none-any.whl:

Publisher: release.yml on Veyllo-Labs/VAF

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page