Repository files navigation

VoidLLM

CIcodecovGo Report CardArtifact HubOpenSSF ScorecardSnykReleaseGoLicense: BSL 1.1

A privacy-first LLM proxy and AI gateway for teams that take control seriously.

VoidLLM is a self-hosted LLM proxy that sits between your applications and LLM providers - OpenAI, Anthropic, Azure, Ollama, vLLM, or any custom endpoint. It gives you organization-wide access control, API key management, usage tracking, rate limiting, and multi-deployment load balancing. One Go binary, sub-2ms proxy overhead, zero knowledge of your prompts.

VoidLLM Dashboard

More screenshots

Usage AnalyticsAPI KeysPlayground

Privacy-First by Design: VoidLLM is a zero-knowledge LLM proxy - it never stores, logs, or persists any prompt or response content. Not as a setting you can toggle - by architecture. Only metadata is tracked: who made the request, which model, how many tokens, how long it took. Your data stays yours.


Why VoidLLM?

ProblemHow VoidLLM solves it
Teams share raw API keys in SlackVirtual keys with org/team/user scoping and RBAC
No visibility into who's spending whatPer-key, per-team, per-org usage tracking + cost estimation
One runaway script burns the monthly budgetRate limits + token budgets enforced by the proxy at every level
Switching providers means changing every appModel aliases - clients call default, the proxy routes it anywhere
Provider goes down, everything breaksMulti-deployment load balancing with automatic failover
Existing proxies log your promptsZero-knowledge proxy architecture - content never touches disk

How it works

flowchart LR
App[Your app / SDK] -->|OpenAI-compatible| Proxy[VoidLLM proxy]
Proxy --> Gate[API key + RBAC<br/>rate limits + budgets]
Gate --> Router[Model alias + load balancing]
Router --> Providers[OpenAI / Anthropic / Azure<br/>Ollama / vLLM / custom]
Proxy -. metadata only .-> DB[(SQLite / PostgreSQL)]
Loading

Your apps speak the OpenAI API to VoidLLM. It authenticates the key, applies RBAC, rate limits and budgets, resolves the model alias, and routes to the right provider. Only metadata - who called, which model, token counts, latency - is written to the database. Prompt and response content passes through memory and is never persisted.

Who it's for

A good fit if you:

  • Self-host LLM infrastructure (vLLM, Ollama) or use managed providers and need one control plane
  • Cannot log prompts or responses for privacy or compliance reasons
  • Need org/team/user/key RBAC, budgets, and model routing
  • Run multiple providers and want aliases, load balancing, and failover

Not the right fit if you:

  • Want a hosted SaaS gateway - VoidLLM is self-hosted by design
  • Need full prompt/response logging or content-level observability - it's zero-knowledge by architecture
  • Need upstream MCP servers with per-user OAuth today - not yet supported

Quick Start

# Generate required keysexport VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)# Start the proxy - no config file needed, VoidLLM boots with sensible defaults
docker run -p 8080:8080 \
-e VOIDLLM_ADMIN_KEY -e VOIDLLM_ENCRYPTION_KEY \
-v voidllm_data:/data \
ghcr.io/voidmind-io/voidllm:latest

On first start VoidLLM prints bootstrap credentials to stdout (shown below) - no config file is required. Add models in the UI, or mount a voidllm.yaml to declare them (see Configuration).

Binary (no Docker needed)

Download the latest binary for your platform from the releases page:

# Linux
curl -sL https://github.com/voidmind-io/voidllm/releases/latest/download/voidllm-linux-amd64.tar.gz | tar xz
export VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)
./voidllm

Available for: Linux (amd64, arm64), Windows (amd64, arm64), macOS (amd64, arm64).

On first start, VoidLLM prints your credentials to stdout:

========================================
BOOTSTRAP COMPLETE - COPY THESE NOW
========================================
API Key: vl_uk_a3f2...
Email: admin@voidllm.local
Password: <random>
========================================

Open http://localhost:8080, log in with the email and password above, and start proxying. The API key is used for SDK calls (Authorization: Bearer vl_uk_...). These credentials are shown once - save them.

One-Click Deploy

Deploy on Railway

Keys are auto-generated. Open the URL Railway gives you and start adding models.

# Your apps just point at the proxy instead of the provider
curl http://localhost:8080/v1/chat/completions \
-H "Authorization: Bearer vl_uk_..." \
-H "Content-Type: application/json" \
-d '{"model":"default","messages":[{"role":"user","content":"hello"}]}'

Any OpenAI-compatible SDK works out of the box - just change the base URL to your VoidLLM proxy.

Features

FeatureDetails
OpenAI-compatible proxy/v1/chat/completions, embeddings, images, audio, streaming
Multi-provider routingOpenAI, Anthropic, Azure, Ollama, vLLM, any custom endpoint
Load balancingRound-robin, least-latency, weighted, priority across deployments
Automatic failoverRetry on 5xx/timeout, circuit breakers, health-aware routing
Web UIDashboard, playground, API keys, teams, models, usage, settings
RBACOrg > Team > User > Key hierarchy, 4 roles
Rate limitsRequests per minute/day, most-restrictive-wins across levels
Token budgetsDaily/monthly limits, real-time enforcement
Usage trackingTokens, cost, duration, TTFT per request
Usage exportCSV / JSON download
Model aliasesClients call default, you control where it routes
MCP gatewayProxy external MCP servers with access control and session management
Code ModeWASM-sandboxed JS for multi-tool orchestration
Prometheus metricsLatency, tokens, active streams, routing, health
DatabaseSQLite (default) or PostgreSQL
DeploymentDocker, Helm chart, graceful shutdown
Pro (€49/mo · €490/yr)Everything above, plus:
Unlimited orgs + teamsNo limit on organizations or teams
Cost reportsModel breakdown, daily trends, budget alerts
Cross-org analyticsUsage and cost across all organizations
SupportPriority email (48h)
Enterprise (€149/mo · €1490/yr)Everything in Pro, plus:
SSO / OIDCGoogle, Azure AD, Okta, Keycloak, any provider
Per-org SSOEach organization gets its own Identity Provider
Auto-provisioningUsers created from allowed email domains
Group syncOIDC groups mapped to VoidLLM teams
Audit logsEvery admin action, filterable API + UI
OpenTelemetryOTLP/gRPC export, request ID correlation
Multi-instanceRedis-backed rate limits and budgets across replicas
SupportDedicated Slack (24h)

Founding Member (€999 one-time): All Enterprise features (current and future), lifetime license, Product Advisory Board, direct founder access, priority support, early access. Limited spots.

Flat pricing - no per-user fees, no per-request charges. Self-hosted on your infrastructure.


MCP Gateway

VoidLLM is an MCP gateway - it exposes built-in management tools and proxies requests to external MCP servers with access control, usage tracking, and automatic session management.

Built-in Tools

ToolDescription
list_modelsList models with health status (RBAC-scoped)
get_model_healthHealth status for a specific model or deployment
get_usageUsage stats for your key/team/org
list_keysAPI keys visible to you
create_keyCreate a temporary API key
list_deploymentsDeployment details (system_admin only)

External MCP Servers

Register external MCP servers via the Admin UI or API. VoidLLM proxies tool calls through /api/v1/mcp/:alias with scoped access control (global, org, or team level), automatic session management, usage tracking, and Prometheus metrics.

Code Mode

Code Mode lets LLMs write JavaScript that orchestrates multiple MCP tool calls in a single execution - instead of one tool call per LLM turn. The JS runs in a WASM-sandboxed QuickJS runtime with no filesystem, no network, and no host access. Reduces token usage by 30-80%.

mcp:
code_mode:
enabled: truepool_size: 8# concurrent WASM runtimesmemory_limit_mb: 16# per executiontimeout: 30s# per executionmax_tool_calls: 50# per execution

Code Mode exposes three tools on /api/v1/mcp:

ToolDescription
list_serversDiscover available MCP servers and tool counts
search_toolsFind tools by keyword across all servers
execute_codeRun JS with MCP tools as await tools.alias.toolName(args)

TypeScript type declarations are auto-generated from tool schemas and included in the execute_code description, so LLMs see available tools and argument types at tools/list time.

Admins can block specific tools from Code Mode via the per-tool blocklist API and UI.

IDE Setup

{
"mcpServers": {
"voidllm": {
"type": "http",
"url": "http://your-voidllm-instance:8080/api/v1/mcp",
"headers": { "Authorization": "Bearer vl_uk_your_key" }
}
}
}

This connects your IDE (Claude Code, Cursor, Windsurf) to the Code Mode endpoint. Management tools (list_models, get_usage, etc.) are available at /api/v1/mcp/voidllm. External MCP servers at /api/v1/mcp/:alias.

Known Limitations

  • SSE transport not supported - MCP servers using the deprecated SSE protocol (pre 2025-03-26 spec) are auto-detected and deactivated. Use servers that support Streamable HTTP.
  • No OAuth for upstream MCP servers - servers requiring per-user OAuth (Jira, Slack, Google) are not yet supported. API key and header auth work.
  • Single instance only - Code Mode's WASM runtime pool is in-memory. Multi-pod deployments require Redis support (coming soon).

Documentation

Full documentation | Blog | FAQ

TopicGuide
Getting StartedQuick Start
ConfigurationAll YAML settings
DockerDocker deployment
KubernetesHelm chart
ProvidersOpenAI, Anthropic, Azure, Ollama, vLLM
Load BalancingStrategies, failover, circuit breakers
MCP GatewayOverview - Servers - Code Mode - IDE Setup
RBACRoles and permissions
PrivacyZero-knowledge architecture
API ReferenceEndpoints and error codes
EnterpriseLicense - SSO - Audit - OTel - Pricing
TroubleshootingCommon issues

Configuration

server:
proxy:
port: 8080models:
# Single endpoint
- name: dolphin-mistralprovider: ollamabase_url: http://localhost:11434/v1timeout: 30saliases: [default]pricing:
input_per_1m: 0.15output_per_1m: 0.60# Load balanced - multiple deployments with failover
- name: gpt-4ostrategy: round-robinaliases: [smart]deployments:
- name: azure-eastprovider: azurebase_url: https://eastus.openai.azure.comapi_key: ${AZURE_EAST_KEY}azure_deployment: gpt-4opriority: 1
- name: openai-fallbackprovider: openaibase_url: https://api.openai.com/v1api_key: ${OPENAI_KEY}priority: 2mcp_servers:
- name: AWS Knowledgealias: awsurl: https://knowledge-mcp.global.api.awsauth_type: nonesettings:
admin_key: ${VOIDLLM_ADMIN_KEY}encryption_key: ${VOIDLLM_ENCRYPTION_KEY}mcp:
code_mode:
enabled: true

Supported providers: openai · anthropic · azure · vllm · ollama · custom

Environment variables are interpolated with ${VAR} syntax. Secrets never hardcoded.

Deployment

Docker Compose

cp voidllm.yaml.example voidllm.yaml
export VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)
docker-compose up

Kubernetes (Helm)

helm install voidllm chart/voidllm/ \
--set secrets.adminKey=$(openssl rand -base64 32) \
--set secrets.encryptionKey=$(openssl rand -base64 32) \
--set config.models[0].name=my-model \
--set config.models[0].provider=ollama \
--set config.models[0].base_url=http://ollama:11434/v1

PostgreSQL and Redis are available as optional subcharts for production deployments.

From Source

# Prerequisites: Go 1.23+, Node 20+cd ui && npm ci && npm run build &&cd ..
go run ./cmd/voidllm --config voidllm.yaml

Production Checklist

  • Use PostgreSQL instead of SQLite
  • Put VoidLLM behind TLS / a reverse proxy
  • Isolate the admin UI/API from public proxy traffic (separate admin.port, with TLS)
  • Use a strong VOIDLLM_ENCRYPTION_KEY (32+ bytes) and keep it in a secrets manager
  • Don't use VOIDLLM_ADMIN_KEY as a production API key - it's for bootstrap only
  • Set resource limits and network policies in Kubernetes
  • Scrape /metrics with Prometheus
  • Configure database backups
  • For multiple replicas, use Redis so rate limits and budgets are shared (they are per-process without it) - Enterprise

See the Security Hardening guide for the full list.

Privacy

This is not a feature toggle. It's an architectural decision that makes VoidLLM a privacy-first LLM proxy.

  • No request body in logs, DB, or any persistent storage
  • No response body in logs, DB, or any persistent storage
  • No prompt caching - content passes through memory only
  • Usage events contain only: who (key/org/team), what (model), how much (tokens/cost)
  • There is no enable_content_logging option. It doesn't exist.
  • Designed to support GDPR compliance - no personal data in prompts is stored or processed

CLI Tools

# Bidirectional database migration
voidllm migrate --from sqlite:///data/voidllm.db --to postgres://user:pass@host/db
# License management (for Enterprise)
voidllm license verify < license.jwt

Project

License

Business Source License 1.1 - source available, self-hosting permitted, competing hosted services prohibited. Converts to Apache 2.0 four years after each release.


Built by VoidMind · voidllm.ai

This project was built with significant assistance from AI (Claude by Anthropic).

About

Privacy-first LLM proxy and AI gateway - load balancing, multi-provider routing, API key management, usage tracking, rate limiting. Self-hosted. Zero knowledge of your prompts.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

130 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

VoidLLM

CIcodecovGo Report CardArtifact HubOpenSSF ScorecardSnykReleaseGoLicense: BSL 1.1

A privacy-first LLM proxy and AI gateway for teams that take control seriously.

VoidLLM is a self-hosted LLM proxy that sits between your applications and LLM providers - OpenAI, Anthropic, Azure, Ollama, vLLM, or any custom endpoint. It gives you organization-wide access control, API key management, usage tracking, rate limiting, and multi-deployment load balancing. One Go binary, sub-2ms proxy overhead, zero knowledge of your prompts.

VoidLLM Dashboard

More screenshots

Usage AnalyticsAPI KeysPlayground

Privacy-First by Design: VoidLLM is a zero-knowledge LLM proxy - it never stores, logs, or persists any prompt or response content. Not as a setting you can toggle - by architecture. Only metadata is tracked: who made the request, which model, how many tokens, how long it took. Your data stays yours.


Why VoidLLM?

ProblemHow VoidLLM solves it
Teams share raw API keys in SlackVirtual keys with org/team/user scoping and RBAC
No visibility into who's spending whatPer-key, per-team, per-org usage tracking + cost estimation
One runaway script burns the monthly budgetRate limits + token budgets enforced by the proxy at every level
Switching providers means changing every appModel aliases - clients call default, the proxy routes it anywhere
Provider goes down, everything breaksMulti-deployment load balancing with automatic failover
Existing proxies log your promptsZero-knowledge proxy architecture - content never touches disk

How it works

flowchart LR
App[Your app / SDK] -->|OpenAI-compatible| Proxy[VoidLLM proxy]
Proxy --> Gate[API key + RBAC<br/>rate limits + budgets]
Gate --> Router[Model alias + load balancing]
Router --> Providers[OpenAI / Anthropic / Azure<br/>Ollama / vLLM / custom]
Proxy -. metadata only .-> DB[(SQLite / PostgreSQL)]
Loading

Your apps speak the OpenAI API to VoidLLM. It authenticates the key, applies RBAC, rate limits and budgets, resolves the model alias, and routes to the right provider. Only metadata - who called, which model, token counts, latency - is written to the database. Prompt and response content passes through memory and is never persisted.

Who it's for

A good fit if you:

  • Self-host LLM infrastructure (vLLM, Ollama) or use managed providers and need one control plane
  • Cannot log prompts or responses for privacy or compliance reasons
  • Need org/team/user/key RBAC, budgets, and model routing
  • Run multiple providers and want aliases, load balancing, and failover

Not the right fit if you:

  • Want a hosted SaaS gateway - VoidLLM is self-hosted by design
  • Need full prompt/response logging or content-level observability - it's zero-knowledge by architecture
  • Need upstream MCP servers with per-user OAuth today - not yet supported

Quick Start

# Generate required keysexport VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)# Start the proxy - no config file needed, VoidLLM boots with sensible defaults
docker run -p 8080:8080 \
-e VOIDLLM_ADMIN_KEY -e VOIDLLM_ENCRYPTION_KEY \
-v voidllm_data:/data \
ghcr.io/voidmind-io/voidllm:latest

On first start VoidLLM prints bootstrap credentials to stdout (shown below) - no config file is required. Add models in the UI, or mount a voidllm.yaml to declare them (see Configuration).

Binary (no Docker needed)

Download the latest binary for your platform from the releases page:

# Linux
curl -sL https://github.com/voidmind-io/voidllm/releases/latest/download/voidllm-linux-amd64.tar.gz | tar xz
export VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)
./voidllm

Available for: Linux (amd64, arm64), Windows (amd64, arm64), macOS (amd64, arm64).

On first start, VoidLLM prints your credentials to stdout:

========================================
BOOTSTRAP COMPLETE - COPY THESE NOW
========================================
API Key: vl_uk_a3f2...
Email: admin@voidllm.local
Password: <random>
========================================

Open http://localhost:8080, log in with the email and password above, and start proxying. The API key is used for SDK calls (Authorization: Bearer vl_uk_...). These credentials are shown once - save them.

One-Click Deploy

Deploy on Railway

Keys are auto-generated. Open the URL Railway gives you and start adding models.

# Your apps just point at the proxy instead of the provider
curl http://localhost:8080/v1/chat/completions \
-H "Authorization: Bearer vl_uk_..." \
-H "Content-Type: application/json" \
-d '{"model":"default","messages":[{"role":"user","content":"hello"}]}'

Any OpenAI-compatible SDK works out of the box - just change the base URL to your VoidLLM proxy.

Features

FeatureDetails
OpenAI-compatible proxy/v1/chat/completions, embeddings, images, audio, streaming
Multi-provider routingOpenAI, Anthropic, Azure, Ollama, vLLM, any custom endpoint
Load balancingRound-robin, least-latency, weighted, priority across deployments
Automatic failoverRetry on 5xx/timeout, circuit breakers, health-aware routing
Web UIDashboard, playground, API keys, teams, models, usage, settings
RBACOrg > Team > User > Key hierarchy, 4 roles
Rate limitsRequests per minute/day, most-restrictive-wins across levels
Token budgetsDaily/monthly limits, real-time enforcement
Usage trackingTokens, cost, duration, TTFT per request
Usage exportCSV / JSON download
Model aliasesClients call default, you control where it routes
MCP gatewayProxy external MCP servers with access control and session management
Code ModeWASM-sandboxed JS for multi-tool orchestration
Prometheus metricsLatency, tokens, active streams, routing, health
DatabaseSQLite (default) or PostgreSQL
DeploymentDocker, Helm chart, graceful shutdown
Pro (€49/mo · €490/yr)Everything above, plus:
Unlimited orgs + teamsNo limit on organizations or teams
Cost reportsModel breakdown, daily trends, budget alerts
Cross-org analyticsUsage and cost across all organizations
SupportPriority email (48h)
Enterprise (€149/mo · €1490/yr)Everything in Pro, plus:
SSO / OIDCGoogle, Azure AD, Okta, Keycloak, any provider
Per-org SSOEach organization gets its own Identity Provider
Auto-provisioningUsers created from allowed email domains
Group syncOIDC groups mapped to VoidLLM teams
Audit logsEvery admin action, filterable API + UI
OpenTelemetryOTLP/gRPC export, request ID correlation
Multi-instanceRedis-backed rate limits and budgets across replicas
SupportDedicated Slack (24h)

Founding Member (€999 one-time): All Enterprise features (current and future), lifetime license, Product Advisory Board, direct founder access, priority support, early access. Limited spots.

Flat pricing - no per-user fees, no per-request charges. Self-hosted on your infrastructure.


MCP Gateway

VoidLLM is an MCP gateway - it exposes built-in management tools and proxies requests to external MCP servers with access control, usage tracking, and automatic session management.

Built-in Tools

ToolDescription
list_modelsList models with health status (RBAC-scoped)
get_model_healthHealth status for a specific model or deployment
get_usageUsage stats for your key/team/org
list_keysAPI keys visible to you
create_keyCreate a temporary API key
list_deploymentsDeployment details (system_admin only)

External MCP Servers

Register external MCP servers via the Admin UI or API. VoidLLM proxies tool calls through /api/v1/mcp/:alias with scoped access control (global, org, or team level), automatic session management, usage tracking, and Prometheus metrics.

Code Mode

Code Mode lets LLMs write JavaScript that orchestrates multiple MCP tool calls in a single execution - instead of one tool call per LLM turn. The JS runs in a WASM-sandboxed QuickJS runtime with no filesystem, no network, and no host access. Reduces token usage by 30-80%.

mcp:
code_mode:
enabled: truepool_size: 8# concurrent WASM runtimesmemory_limit_mb: 16# per executiontimeout: 30s# per executionmax_tool_calls: 50# per execution

Code Mode exposes three tools on /api/v1/mcp:

ToolDescription
list_serversDiscover available MCP servers and tool counts
search_toolsFind tools by keyword across all servers
execute_codeRun JS with MCP tools as await tools.alias.toolName(args)

TypeScript type declarations are auto-generated from tool schemas and included in the execute_code description, so LLMs see available tools and argument types at tools/list time.

Admins can block specific tools from Code Mode via the per-tool blocklist API and UI.

IDE Setup

{
"mcpServers": {
"voidllm": {
"type": "http",
"url": "http://your-voidllm-instance:8080/api/v1/mcp",
"headers": { "Authorization": "Bearer vl_uk_your_key" }
}
}
}

This connects your IDE (Claude Code, Cursor, Windsurf) to the Code Mode endpoint. Management tools (list_models, get_usage, etc.) are available at /api/v1/mcp/voidllm. External MCP servers at /api/v1/mcp/:alias.

Known Limitations

  • SSE transport not supported - MCP servers using the deprecated SSE protocol (pre 2025-03-26 spec) are auto-detected and deactivated. Use servers that support Streamable HTTP.
  • No OAuth for upstream MCP servers - servers requiring per-user OAuth (Jira, Slack, Google) are not yet supported. API key and header auth work.
  • Single instance only - Code Mode's WASM runtime pool is in-memory. Multi-pod deployments require Redis support (coming soon).

Documentation

Full documentation | Blog | FAQ

TopicGuide
Getting StartedQuick Start
ConfigurationAll YAML settings
DockerDocker deployment
KubernetesHelm chart
ProvidersOpenAI, Anthropic, Azure, Ollama, vLLM
Load BalancingStrategies, failover, circuit breakers
MCP GatewayOverview - Servers - Code Mode - IDE Setup
RBACRoles and permissions
PrivacyZero-knowledge architecture
API ReferenceEndpoints and error codes
EnterpriseLicense - SSO - Audit - OTel - Pricing
TroubleshootingCommon issues

Configuration

server:
proxy:
port: 8080models:
# Single endpoint
- name: dolphin-mistralprovider: ollamabase_url: http://localhost:11434/v1timeout: 30saliases: [default]pricing:
input_per_1m: 0.15output_per_1m: 0.60# Load balanced - multiple deployments with failover
- name: gpt-4ostrategy: round-robinaliases: [smart]deployments:
- name: azure-eastprovider: azurebase_url: https://eastus.openai.azure.comapi_key: ${AZURE_EAST_KEY}azure_deployment: gpt-4opriority: 1
- name: openai-fallbackprovider: openaibase_url: https://api.openai.com/v1api_key: ${OPENAI_KEY}priority: 2mcp_servers:
- name: AWS Knowledgealias: awsurl: https://knowledge-mcp.global.api.awsauth_type: nonesettings:
admin_key: ${VOIDLLM_ADMIN_KEY}encryption_key: ${VOIDLLM_ENCRYPTION_KEY}mcp:
code_mode:
enabled: true

Supported providers: openai · anthropic · azure · vllm · ollama · custom

Environment variables are interpolated with ${VAR} syntax. Secrets never hardcoded.

Deployment

Docker Compose

cp voidllm.yaml.example voidllm.yaml
export VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)
docker-compose up

Kubernetes (Helm)

helm install voidllm chart/voidllm/ \
--set secrets.adminKey=$(openssl rand -base64 32) \
--set secrets.encryptionKey=$(openssl rand -base64 32) \
--set config.models[0].name=my-model \
--set config.models[0].provider=ollama \
--set config.models[0].base_url=http://ollama:11434/v1

PostgreSQL and Redis are available as optional subcharts for production deployments.

From Source

# Prerequisites: Go 1.23+, Node 20+cd ui && npm ci && npm run build &&cd ..
go run ./cmd/voidllm --config voidllm.yaml

Production Checklist

  • Use PostgreSQL instead of SQLite
  • Put VoidLLM behind TLS / a reverse proxy
  • Isolate the admin UI/API from public proxy traffic (separate admin.port, with TLS)
  • Use a strong VOIDLLM_ENCRYPTION_KEY (32+ bytes) and keep it in a secrets manager
  • Don't use VOIDLLM_ADMIN_KEY as a production API key - it's for bootstrap only
  • Set resource limits and network policies in Kubernetes
  • Scrape /metrics with Prometheus
  • Configure database backups
  • For multiple replicas, use Redis so rate limits and budgets are shared (they are per-process without it) - Enterprise

See the Security Hardening guide for the full list.

Privacy

This is not a feature toggle. It's an architectural decision that makes VoidLLM a privacy-first LLM proxy.

  • No request body in logs, DB, or any persistent storage
  • No response body in logs, DB, or any persistent storage
  • No prompt caching - content passes through memory only
  • Usage events contain only: who (key/org/team), what (model), how much (tokens/cost)
  • There is no enable_content_logging option. It doesn't exist.
  • Designed to support GDPR compliance - no personal data in prompts is stored or processed

CLI Tools

# Bidirectional database migration
voidllm migrate --from sqlite:///data/voidllm.db --to postgres://user:pass@host/db
# License management (for Enterprise)
voidllm license verify < license.jwt

Project

License

Business Source License 1.1 - source available, self-hosting permitted, competing hosted services prohibited. Converts to Apache 2.0 four years after each release.


Built by VoidMind · voidllm.ai

This project was built with significant assistance from AI (Claude by Anthropic).

About

Privacy-first LLM proxy and AI gateway - load balancing, multi-provider routing, API key management, usage tracking, rate limiting. Self-hosted. Zero knowledge of your prompts.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

130 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

VoidLLM

CIcodecovGo Report CardArtifact HubOpenSSF ScorecardSnykReleaseGoLicense: BSL 1.1

A privacy-first LLM proxy and AI gateway for teams that take control seriously.

VoidLLM is a self-hosted LLM proxy that sits between your applications and LLM providers - OpenAI, Anthropic, Azure, Ollama, vLLM, or any custom endpoint. It gives you organization-wide access control, API key management, usage tracking, rate limiting, and multi-deployment load balancing. One Go binary, sub-2ms proxy overhead, zero knowledge of your prompts.

VoidLLM Dashboard

More screenshots

Usage AnalyticsAPI KeysPlayground

Privacy-First by Design: VoidLLM is a zero-knowledge LLM proxy - it never stores, logs, or persists any prompt or response content. Not as a setting you can toggle - by architecture. Only metadata is tracked: who made the request, which model, how many tokens, how long it took. Your data stays yours.


Why VoidLLM?

ProblemHow VoidLLM solves it
Teams share raw API keys in SlackVirtual keys with org/team/user scoping and RBAC
No visibility into who's spending whatPer-key, per-team, per-org usage tracking + cost estimation
One runaway script burns the monthly budgetRate limits + token budgets enforced by the proxy at every level
Switching providers means changing every appModel aliases - clients call default, the proxy routes it anywhere
Provider goes down, everything breaksMulti-deployment load balancing with automatic failover
Existing proxies log your promptsZero-knowledge proxy architecture - content never touches disk

How it works

flowchart LR
App[Your app / SDK] -->|OpenAI-compatible| Proxy[VoidLLM proxy]
Proxy --> Gate[API key + RBAC<br/>rate limits + budgets]
Gate --> Router[Model alias + load balancing]
Router --> Providers[OpenAI / Anthropic / Azure<br/>Ollama / vLLM / custom]
Proxy -. metadata only .-> DB[(SQLite / PostgreSQL)]
Loading

Your apps speak the OpenAI API to VoidLLM. It authenticates the key, applies RBAC, rate limits and budgets, resolves the model alias, and routes to the right provider. Only metadata - who called, which model, token counts, latency - is written to the database. Prompt and response content passes through memory and is never persisted.

Who it's for

A good fit if you:

  • Self-host LLM infrastructure (vLLM, Ollama) or use managed providers and need one control plane
  • Cannot log prompts or responses for privacy or compliance reasons
  • Need org/team/user/key RBAC, budgets, and model routing
  • Run multiple providers and want aliases, load balancing, and failover

Not the right fit if you:

  • Want a hosted SaaS gateway - VoidLLM is self-hosted by design
  • Need full prompt/response logging or content-level observability - it's zero-knowledge by architecture
  • Need upstream MCP servers with per-user OAuth today - not yet supported

Quick Start

# Generate required keysexport VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)# Start the proxy - no config file needed, VoidLLM boots with sensible defaults
docker run -p 8080:8080 \
-e VOIDLLM_ADMIN_KEY -e VOIDLLM_ENCRYPTION_KEY \
-v voidllm_data:/data \
ghcr.io/voidmind-io/voidllm:latest

On first start VoidLLM prints bootstrap credentials to stdout (shown below) - no config file is required. Add models in the UI, or mount a voidllm.yaml to declare them (see Configuration).

Binary (no Docker needed)

Download the latest binary for your platform from the releases page:

# Linux
curl -sL https://github.com/voidmind-io/voidllm/releases/latest/download/voidllm-linux-amd64.tar.gz | tar xz
export VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)
./voidllm

Available for: Linux (amd64, arm64), Windows (amd64, arm64), macOS (amd64, arm64).

On first start, VoidLLM prints your credentials to stdout:

========================================
BOOTSTRAP COMPLETE - COPY THESE NOW
========================================
API Key: vl_uk_a3f2...
Email: admin@voidllm.local
Password: <random>
========================================

Open http://localhost:8080, log in with the email and password above, and start proxying. The API key is used for SDK calls (Authorization: Bearer vl_uk_...). These credentials are shown once - save them.

One-Click Deploy

Deploy on Railway

Keys are auto-generated. Open the URL Railway gives you and start adding models.

# Your apps just point at the proxy instead of the provider
curl http://localhost:8080/v1/chat/completions \
-H "Authorization: Bearer vl_uk_..." \
-H "Content-Type: application/json" \
-d '{"model":"default","messages":[{"role":"user","content":"hello"}]}'

Any OpenAI-compatible SDK works out of the box - just change the base URL to your VoidLLM proxy.

Features

FeatureDetails
OpenAI-compatible proxy/v1/chat/completions, embeddings, images, audio, streaming
Multi-provider routingOpenAI, Anthropic, Azure, Ollama, vLLM, any custom endpoint
Load balancingRound-robin, least-latency, weighted, priority across deployments
Automatic failoverRetry on 5xx/timeout, circuit breakers, health-aware routing
Web UIDashboard, playground, API keys, teams, models, usage, settings
RBACOrg > Team > User > Key hierarchy, 4 roles
Rate limitsRequests per minute/day, most-restrictive-wins across levels
Token budgetsDaily/monthly limits, real-time enforcement
Usage trackingTokens, cost, duration, TTFT per request
Usage exportCSV / JSON download
Model aliasesClients call default, you control where it routes
MCP gatewayProxy external MCP servers with access control and session management
Code ModeWASM-sandboxed JS for multi-tool orchestration
Prometheus metricsLatency, tokens, active streams, routing, health
DatabaseSQLite (default) or PostgreSQL
DeploymentDocker, Helm chart, graceful shutdown
Pro (€49/mo · €490/yr)Everything above, plus:
Unlimited orgs + teamsNo limit on organizations or teams
Cost reportsModel breakdown, daily trends, budget alerts
Cross-org analyticsUsage and cost across all organizations
SupportPriority email (48h)
Enterprise (€149/mo · €1490/yr)Everything in Pro, plus:
SSO / OIDCGoogle, Azure AD, Okta, Keycloak, any provider
Per-org SSOEach organization gets its own Identity Provider
Auto-provisioningUsers created from allowed email domains
Group syncOIDC groups mapped to VoidLLM teams
Audit logsEvery admin action, filterable API + UI
OpenTelemetryOTLP/gRPC export, request ID correlation
Multi-instanceRedis-backed rate limits and budgets across replicas
SupportDedicated Slack (24h)

Founding Member (€999 one-time): All Enterprise features (current and future), lifetime license, Product Advisory Board, direct founder access, priority support, early access. Limited spots.

Flat pricing - no per-user fees, no per-request charges. Self-hosted on your infrastructure.


MCP Gateway

VoidLLM is an MCP gateway - it exposes built-in management tools and proxies requests to external MCP servers with access control, usage tracking, and automatic session management.

Built-in Tools

ToolDescription
list_modelsList models with health status (RBAC-scoped)
get_model_healthHealth status for a specific model or deployment
get_usageUsage stats for your key/team/org
list_keysAPI keys visible to you
create_keyCreate a temporary API key
list_deploymentsDeployment details (system_admin only)

External MCP Servers

Register external MCP servers via the Admin UI or API. VoidLLM proxies tool calls through /api/v1/mcp/:alias with scoped access control (global, org, or team level), automatic session management, usage tracking, and Prometheus metrics.

Code Mode

Code Mode lets LLMs write JavaScript that orchestrates multiple MCP tool calls in a single execution - instead of one tool call per LLM turn. The JS runs in a WASM-sandboxed QuickJS runtime with no filesystem, no network, and no host access. Reduces token usage by 30-80%.

mcp:
code_mode:
enabled: truepool_size: 8# concurrent WASM runtimesmemory_limit_mb: 16# per executiontimeout: 30s# per executionmax_tool_calls: 50# per execution

Code Mode exposes three tools on /api/v1/mcp:

ToolDescription
list_serversDiscover available MCP servers and tool counts
search_toolsFind tools by keyword across all servers
execute_codeRun JS with MCP tools as await tools.alias.toolName(args)

TypeScript type declarations are auto-generated from tool schemas and included in the execute_code description, so LLMs see available tools and argument types at tools/list time.

Admins can block specific tools from Code Mode via the per-tool blocklist API and UI.

IDE Setup

{
"mcpServers": {
"voidllm": {
"type": "http",
"url": "http://your-voidllm-instance:8080/api/v1/mcp",
"headers": { "Authorization": "Bearer vl_uk_your_key" }
}
}
}

This connects your IDE (Claude Code, Cursor, Windsurf) to the Code Mode endpoint. Management tools (list_models, get_usage, etc.) are available at /api/v1/mcp/voidllm. External MCP servers at /api/v1/mcp/:alias.

Known Limitations

  • SSE transport not supported - MCP servers using the deprecated SSE protocol (pre 2025-03-26 spec) are auto-detected and deactivated. Use servers that support Streamable HTTP.
  • No OAuth for upstream MCP servers - servers requiring per-user OAuth (Jira, Slack, Google) are not yet supported. API key and header auth work.
  • Single instance only - Code Mode's WASM runtime pool is in-memory. Multi-pod deployments require Redis support (coming soon).

Documentation

Full documentation | Blog | FAQ

TopicGuide
Getting StartedQuick Start
ConfigurationAll YAML settings
DockerDocker deployment
KubernetesHelm chart
ProvidersOpenAI, Anthropic, Azure, Ollama, vLLM
Load BalancingStrategies, failover, circuit breakers
MCP GatewayOverview - Servers - Code Mode - IDE Setup
RBACRoles and permissions
PrivacyZero-knowledge architecture
API ReferenceEndpoints and error codes
EnterpriseLicense - SSO - Audit - OTel - Pricing
TroubleshootingCommon issues

Configuration

server:
proxy:
port: 8080models:
# Single endpoint
- name: dolphin-mistralprovider: ollamabase_url: http://localhost:11434/v1timeout: 30saliases: [default]pricing:
input_per_1m: 0.15output_per_1m: 0.60# Load balanced - multiple deployments with failover
- name: gpt-4ostrategy: round-robinaliases: [smart]deployments:
- name: azure-eastprovider: azurebase_url: https://eastus.openai.azure.comapi_key: ${AZURE_EAST_KEY}azure_deployment: gpt-4opriority: 1
- name: openai-fallbackprovider: openaibase_url: https://api.openai.com/v1api_key: ${OPENAI_KEY}priority: 2mcp_servers:
- name: AWS Knowledgealias: awsurl: https://knowledge-mcp.global.api.awsauth_type: nonesettings:
admin_key: ${VOIDLLM_ADMIN_KEY}encryption_key: ${VOIDLLM_ENCRYPTION_KEY}mcp:
code_mode:
enabled: true

Supported providers: openai · anthropic · azure · vllm · ollama · custom

Environment variables are interpolated with ${VAR} syntax. Secrets never hardcoded.

Deployment

Docker Compose

cp voidllm.yaml.example voidllm.yaml
export VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)
docker-compose up

Kubernetes (Helm)

helm install voidllm chart/voidllm/ \
--set secrets.adminKey=$(openssl rand -base64 32) \
--set secrets.encryptionKey=$(openssl rand -base64 32) \
--set config.models[0].name=my-model \
--set config.models[0].provider=ollama \
--set config.models[0].base_url=http://ollama:11434/v1

PostgreSQL and Redis are available as optional subcharts for production deployments.

From Source

# Prerequisites: Go 1.23+, Node 20+cd ui && npm ci && npm run build &&cd ..
go run ./cmd/voidllm --config voidllm.yaml

Production Checklist

  • Use PostgreSQL instead of SQLite
  • Put VoidLLM behind TLS / a reverse proxy
  • Isolate the admin UI/API from public proxy traffic (separate admin.port, with TLS)
  • Use a strong VOIDLLM_ENCRYPTION_KEY (32+ bytes) and keep it in a secrets manager
  • Don't use VOIDLLM_ADMIN_KEY as a production API key - it's for bootstrap only
  • Set resource limits and network policies in Kubernetes
  • Scrape /metrics with Prometheus
  • Configure database backups
  • For multiple replicas, use Redis so rate limits and budgets are shared (they are per-process without it) - Enterprise

See the Security Hardening guide for the full list.

Privacy

This is not a feature toggle. It's an architectural decision that makes VoidLLM a privacy-first LLM proxy.

  • No request body in logs, DB, or any persistent storage
  • No response body in logs, DB, or any persistent storage
  • No prompt caching - content passes through memory only
  • Usage events contain only: who (key/org/team), what (model), how much (tokens/cost)
  • There is no enable_content_logging option. It doesn't exist.
  • Designed to support GDPR compliance - no personal data in prompts is stored or processed

CLI Tools

# Bidirectional database migration
voidllm migrate --from sqlite:///data/voidllm.db --to postgres://user:pass@host/db
# License management (for Enterprise)
voidllm license verify < license.jwt

Project

License

Business Source License 1.1 - source available, self-hosting permitted, competing hosted services prohibited. Converts to Apache 2.0 four years after each release.


Built by VoidMind · voidllm.ai

This project was built with significant assistance from AI (Claude by Anthropic).

About

Privacy-first LLM proxy and AI gateway - load balancing, multi-provider routing, API key management, usage tracking, rate limiting. Self-hosted. Zero knowledge of your prompts.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

130 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

VoidLLM

CIcodecovGo Report CardArtifact HubOpenSSF ScorecardSnykReleaseGoLicense: BSL 1.1

A privacy-first LLM proxy and AI gateway for teams that take control seriously.

VoidLLM is a self-hosted LLM proxy that sits between your applications and LLM providers - OpenAI, Anthropic, Azure, Ollama, vLLM, or any custom endpoint. It gives you organization-wide access control, API key management, usage tracking, rate limiting, and multi-deployment load balancing. One Go binary, sub-2ms proxy overhead, zero knowledge of your prompts.

VoidLLM Dashboard

More screenshots

Usage AnalyticsAPI KeysPlayground

Privacy-First by Design: VoidLLM is a zero-knowledge LLM proxy - it never stores, logs, or persists any prompt or response content. Not as a setting you can toggle - by architecture. Only metadata is tracked: who made the request, which model, how many tokens, how long it took. Your data stays yours.


Why VoidLLM?

ProblemHow VoidLLM solves it
Teams share raw API keys in SlackVirtual keys with org/team/user scoping and RBAC
No visibility into who's spending whatPer-key, per-team, per-org usage tracking + cost estimation
One runaway script burns the monthly budgetRate limits + token budgets enforced by the proxy at every level
Switching providers means changing every appModel aliases - clients call default, the proxy routes it anywhere
Provider goes down, everything breaksMulti-deployment load balancing with automatic failover
Existing proxies log your promptsZero-knowledge proxy architecture - content never touches disk

How it works

flowchart LR
App[Your app / SDK] -->|OpenAI-compatible| Proxy[VoidLLM proxy]
Proxy --> Gate[API key + RBAC<br/>rate limits + budgets]
Gate --> Router[Model alias + load balancing]
Router --> Providers[OpenAI / Anthropic / Azure<br/>Ollama / vLLM / custom]
Proxy -. metadata only .-> DB[(SQLite / PostgreSQL)]
Loading

Your apps speak the OpenAI API to VoidLLM. It authenticates the key, applies RBAC, rate limits and budgets, resolves the model alias, and routes to the right provider. Only metadata - who called, which model, token counts, latency - is written to the database. Prompt and response content passes through memory and is never persisted.

Who it's for

A good fit if you:

  • Self-host LLM infrastructure (vLLM, Ollama) or use managed providers and need one control plane
  • Cannot log prompts or responses for privacy or compliance reasons
  • Need org/team/user/key RBAC, budgets, and model routing
  • Run multiple providers and want aliases, load balancing, and failover

Not the right fit if you:

  • Want a hosted SaaS gateway - VoidLLM is self-hosted by design
  • Need full prompt/response logging or content-level observability - it's zero-knowledge by architecture
  • Need upstream MCP servers with per-user OAuth today - not yet supported

Quick Start

# Generate required keysexport VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)# Start the proxy - no config file needed, VoidLLM boots with sensible defaults
docker run -p 8080:8080 \
-e VOIDLLM_ADMIN_KEY -e VOIDLLM_ENCRYPTION_KEY \
-v voidllm_data:/data \
ghcr.io/voidmind-io/voidllm:latest

On first start VoidLLM prints bootstrap credentials to stdout (shown below) - no config file is required. Add models in the UI, or mount a voidllm.yaml to declare them (see Configuration).

Binary (no Docker needed)

Download the latest binary for your platform from the releases page:

# Linux
curl -sL https://github.com/voidmind-io/voidllm/releases/latest/download/voidllm-linux-amd64.tar.gz | tar xz
export VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)
./voidllm

Available for: Linux (amd64, arm64), Windows (amd64, arm64), macOS (amd64, arm64).

On first start, VoidLLM prints your credentials to stdout:

========================================
BOOTSTRAP COMPLETE - COPY THESE NOW
========================================
API Key: vl_uk_a3f2...
Email: admin@voidllm.local
Password: <random>
========================================

Open http://localhost:8080, log in with the email and password above, and start proxying. The API key is used for SDK calls (Authorization: Bearer vl_uk_...). These credentials are shown once - save them.

One-Click Deploy

Deploy on Railway

Keys are auto-generated. Open the URL Railway gives you and start adding models.

# Your apps just point at the proxy instead of the provider
curl http://localhost:8080/v1/chat/completions \
-H "Authorization: Bearer vl_uk_..." \
-H "Content-Type: application/json" \
-d '{"model":"default","messages":[{"role":"user","content":"hello"}]}'

Any OpenAI-compatible SDK works out of the box - just change the base URL to your VoidLLM proxy.

Features

FeatureDetails
OpenAI-compatible proxy/v1/chat/completions, embeddings, images, audio, streaming
Multi-provider routingOpenAI, Anthropic, Azure, Ollama, vLLM, any custom endpoint
Load balancingRound-robin, least-latency, weighted, priority across deployments
Automatic failoverRetry on 5xx/timeout, circuit breakers, health-aware routing
Web UIDashboard, playground, API keys, teams, models, usage, settings
RBACOrg > Team > User > Key hierarchy, 4 roles
Rate limitsRequests per minute/day, most-restrictive-wins across levels
Token budgetsDaily/monthly limits, real-time enforcement
Usage trackingTokens, cost, duration, TTFT per request
Usage exportCSV / JSON download
Model aliasesClients call default, you control where it routes
MCP gatewayProxy external MCP servers with access control and session management
Code ModeWASM-sandboxed JS for multi-tool orchestration
Prometheus metricsLatency, tokens, active streams, routing, health
DatabaseSQLite (default) or PostgreSQL
DeploymentDocker, Helm chart, graceful shutdown
Pro (€49/mo · €490/yr)Everything above, plus:
Unlimited orgs + teamsNo limit on organizations or teams
Cost reportsModel breakdown, daily trends, budget alerts
Cross-org analyticsUsage and cost across all organizations
SupportPriority email (48h)
Enterprise (€149/mo · €1490/yr)Everything in Pro, plus:
SSO / OIDCGoogle, Azure AD, Okta, Keycloak, any provider
Per-org SSOEach organization gets its own Identity Provider
Auto-provisioningUsers created from allowed email domains
Group syncOIDC groups mapped to VoidLLM teams
Audit logsEvery admin action, filterable API + UI
OpenTelemetryOTLP/gRPC export, request ID correlation
Multi-instanceRedis-backed rate limits and budgets across replicas
SupportDedicated Slack (24h)

Founding Member (€999 one-time): All Enterprise features (current and future), lifetime license, Product Advisory Board, direct founder access, priority support, early access. Limited spots.

Flat pricing - no per-user fees, no per-request charges. Self-hosted on your infrastructure.


MCP Gateway

VoidLLM is an MCP gateway - it exposes built-in management tools and proxies requests to external MCP servers with access control, usage tracking, and automatic session management.

Built-in Tools

ToolDescription
list_modelsList models with health status (RBAC-scoped)
get_model_healthHealth status for a specific model or deployment
get_usageUsage stats for your key/team/org
list_keysAPI keys visible to you
create_keyCreate a temporary API key
list_deploymentsDeployment details (system_admin only)

External MCP Servers

Register external MCP servers via the Admin UI or API. VoidLLM proxies tool calls through /api/v1/mcp/:alias with scoped access control (global, org, or team level), automatic session management, usage tracking, and Prometheus metrics.

Code Mode

Code Mode lets LLMs write JavaScript that orchestrates multiple MCP tool calls in a single execution - instead of one tool call per LLM turn. The JS runs in a WASM-sandboxed QuickJS runtime with no filesystem, no network, and no host access. Reduces token usage by 30-80%.

mcp:
code_mode:
enabled: truepool_size: 8# concurrent WASM runtimesmemory_limit_mb: 16# per executiontimeout: 30s# per executionmax_tool_calls: 50# per execution

Code Mode exposes three tools on /api/v1/mcp:

ToolDescription
list_serversDiscover available MCP servers and tool counts
search_toolsFind tools by keyword across all servers
execute_codeRun JS with MCP tools as await tools.alias.toolName(args)

TypeScript type declarations are auto-generated from tool schemas and included in the execute_code description, so LLMs see available tools and argument types at tools/list time.

Admins can block specific tools from Code Mode via the per-tool blocklist API and UI.

IDE Setup

{
"mcpServers": {
"voidllm": {
"type": "http",
"url": "http://your-voidllm-instance:8080/api/v1/mcp",
"headers": { "Authorization": "Bearer vl_uk_your_key" }
}
}
}

This connects your IDE (Claude Code, Cursor, Windsurf) to the Code Mode endpoint. Management tools (list_models, get_usage, etc.) are available at /api/v1/mcp/voidllm. External MCP servers at /api/v1/mcp/:alias.

Known Limitations

  • SSE transport not supported - MCP servers using the deprecated SSE protocol (pre 2025-03-26 spec) are auto-detected and deactivated. Use servers that support Streamable HTTP.
  • No OAuth for upstream MCP servers - servers requiring per-user OAuth (Jira, Slack, Google) are not yet supported. API key and header auth work.
  • Single instance only - Code Mode's WASM runtime pool is in-memory. Multi-pod deployments require Redis support (coming soon).

Documentation

Full documentation | Blog | FAQ

TopicGuide
Getting StartedQuick Start
ConfigurationAll YAML settings
DockerDocker deployment
KubernetesHelm chart
ProvidersOpenAI, Anthropic, Azure, Ollama, vLLM
Load BalancingStrategies, failover, circuit breakers
MCP GatewayOverview - Servers - Code Mode - IDE Setup
RBACRoles and permissions
PrivacyZero-knowledge architecture
API ReferenceEndpoints and error codes
EnterpriseLicense - SSO - Audit - OTel - Pricing
TroubleshootingCommon issues

Configuration

server:
proxy:
port: 8080models:
# Single endpoint
- name: dolphin-mistralprovider: ollamabase_url: http://localhost:11434/v1timeout: 30saliases: [default]pricing:
input_per_1m: 0.15output_per_1m: 0.60# Load balanced - multiple deployments with failover
- name: gpt-4ostrategy: round-robinaliases: [smart]deployments:
- name: azure-eastprovider: azurebase_url: https://eastus.openai.azure.comapi_key: ${AZURE_EAST_KEY}azure_deployment: gpt-4opriority: 1
- name: openai-fallbackprovider: openaibase_url: https://api.openai.com/v1api_key: ${OPENAI_KEY}priority: 2mcp_servers:
- name: AWS Knowledgealias: awsurl: https://knowledge-mcp.global.api.awsauth_type: nonesettings:
admin_key: ${VOIDLLM_ADMIN_KEY}encryption_key: ${VOIDLLM_ENCRYPTION_KEY}mcp:
code_mode:
enabled: true

Supported providers: openai · anthropic · azure · vllm · ollama · custom

Environment variables are interpolated with ${VAR} syntax. Secrets never hardcoded.

Deployment

Docker Compose

cp voidllm.yaml.example voidllm.yaml
export VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)
docker-compose up

Kubernetes (Helm)

helm install voidllm chart/voidllm/ \
--set secrets.adminKey=$(openssl rand -base64 32) \
--set secrets.encryptionKey=$(openssl rand -base64 32) \
--set config.models[0].name=my-model \
--set config.models[0].provider=ollama \
--set config.models[0].base_url=http://ollama:11434/v1

PostgreSQL and Redis are available as optional subcharts for production deployments.

From Source

# Prerequisites: Go 1.23+, Node 20+cd ui && npm ci && npm run build &&cd ..
go run ./cmd/voidllm --config voidllm.yaml

Production Checklist

  • Use PostgreSQL instead of SQLite
  • Put VoidLLM behind TLS / a reverse proxy
  • Isolate the admin UI/API from public proxy traffic (separate admin.port, with TLS)
  • Use a strong VOIDLLM_ENCRYPTION_KEY (32+ bytes) and keep it in a secrets manager
  • Don't use VOIDLLM_ADMIN_KEY as a production API key - it's for bootstrap only
  • Set resource limits and network policies in Kubernetes
  • Scrape /metrics with Prometheus
  • Configure database backups
  • For multiple replicas, use Redis so rate limits and budgets are shared (they are per-process without it) - Enterprise

See the Security Hardening guide for the full list.

Privacy

This is not a feature toggle. It's an architectural decision that makes VoidLLM a privacy-first LLM proxy.

  • No request body in logs, DB, or any persistent storage
  • No response body in logs, DB, or any persistent storage
  • No prompt caching - content passes through memory only
  • Usage events contain only: who (key/org/team), what (model), how much (tokens/cost)
  • There is no enable_content_logging option. It doesn't exist.
  • Designed to support GDPR compliance - no personal data in prompts is stored or processed

CLI Tools

# Bidirectional database migration
voidllm migrate --from sqlite:///data/voidllm.db --to postgres://user:pass@host/db
# License management (for Enterprise)
voidllm license verify < license.jwt

Project

License

Business Source License 1.1 - source available, self-hosting permitted, competing hosted services prohibited. Converts to Apache 2.0 four years after each release.


Built by VoidMind · voidllm.ai

This project was built with significant assistance from AI (Claude by Anthropic).

About

Privacy-first LLM proxy and AI gateway - load balancing, multi-provider routing, API key management, usage tracking, rate limiting. Self-hosted. Zero knowledge of your prompts.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

130 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

VoidLLM

CIcodecovGo Report CardArtifact HubOpenSSF ScorecardSnykReleaseGoLicense: BSL 1.1

A privacy-first LLM proxy and AI gateway for teams that take control seriously.

VoidLLM is a self-hosted LLM proxy that sits between your applications and LLM providers - OpenAI, Anthropic, Azure, Ollama, vLLM, or any custom endpoint. It gives you organization-wide access control, API key management, usage tracking, rate limiting, and multi-deployment load balancing. One Go binary, sub-2ms proxy overhead, zero knowledge of your prompts.

VoidLLM Dashboard

More screenshots

Usage AnalyticsAPI KeysPlayground

Privacy-First by Design: VoidLLM is a zero-knowledge LLM proxy - it never stores, logs, or persists any prompt or response content. Not as a setting you can toggle - by architecture. Only metadata is tracked: who made the request, which model, how many tokens, how long it took. Your data stays yours.


Why VoidLLM?

ProblemHow VoidLLM solves it
Teams share raw API keys in SlackVirtual keys with org/team/user scoping and RBAC
No visibility into who's spending whatPer-key, per-team, per-org usage tracking + cost estimation
One runaway script burns the monthly budgetRate limits + token budgets enforced by the proxy at every level
Switching providers means changing every appModel aliases - clients call default, the proxy routes it anywhere
Provider goes down, everything breaksMulti-deployment load balancing with automatic failover
Existing proxies log your promptsZero-knowledge proxy architecture - content never touches disk

How it works

flowchart LR
App[Your app / SDK] -->|OpenAI-compatible| Proxy[VoidLLM proxy]
Proxy --> Gate[API key + RBAC<br/>rate limits + budgets]
Gate --> Router[Model alias + load balancing]
Router --> Providers[OpenAI / Anthropic / Azure<br/>Ollama / vLLM / custom]
Proxy -. metadata only .-> DB[(SQLite / PostgreSQL)]
Loading

Your apps speak the OpenAI API to VoidLLM. It authenticates the key, applies RBAC, rate limits and budgets, resolves the model alias, and routes to the right provider. Only metadata - who called, which model, token counts, latency - is written to the database. Prompt and response content passes through memory and is never persisted.

Who it's for

A good fit if you:

  • Self-host LLM infrastructure (vLLM, Ollama) or use managed providers and need one control plane
  • Cannot log prompts or responses for privacy or compliance reasons
  • Need org/team/user/key RBAC, budgets, and model routing
  • Run multiple providers and want aliases, load balancing, and failover

Not the right fit if you:

  • Want a hosted SaaS gateway - VoidLLM is self-hosted by design
  • Need full prompt/response logging or content-level observability - it's zero-knowledge by architecture
  • Need upstream MCP servers with per-user OAuth today - not yet supported

Quick Start

# Generate required keysexport VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)# Start the proxy - no config file needed, VoidLLM boots with sensible defaults
docker run -p 8080:8080 \
-e VOIDLLM_ADMIN_KEY -e VOIDLLM_ENCRYPTION_KEY \
-v voidllm_data:/data \
ghcr.io/voidmind-io/voidllm:latest

On first start VoidLLM prints bootstrap credentials to stdout (shown below) - no config file is required. Add models in the UI, or mount a voidllm.yaml to declare them (see Configuration).

Binary (no Docker needed)

Download the latest binary for your platform from the releases page:

# Linux
curl -sL https://github.com/voidmind-io/voidllm/releases/latest/download/voidllm-linux-amd64.tar.gz | tar xz
export VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)
./voidllm

Available for: Linux (amd64, arm64), Windows (amd64, arm64), macOS (amd64, arm64).

On first start, VoidLLM prints your credentials to stdout:

========================================
BOOTSTRAP COMPLETE - COPY THESE NOW
========================================
API Key: vl_uk_a3f2...
Email: admin@voidllm.local
Password: <random>
========================================

Open http://localhost:8080, log in with the email and password above, and start proxying. The API key is used for SDK calls (Authorization: Bearer vl_uk_...). These credentials are shown once - save them.

One-Click Deploy

Deploy on Railway

Keys are auto-generated. Open the URL Railway gives you and start adding models.

# Your apps just point at the proxy instead of the provider
curl http://localhost:8080/v1/chat/completions \
-H "Authorization: Bearer vl_uk_..." \
-H "Content-Type: application/json" \
-d '{"model":"default","messages":[{"role":"user","content":"hello"}]}'

Any OpenAI-compatible SDK works out of the box - just change the base URL to your VoidLLM proxy.

Features

FeatureDetails
OpenAI-compatible proxy/v1/chat/completions, embeddings, images, audio, streaming
Multi-provider routingOpenAI, Anthropic, Azure, Ollama, vLLM, any custom endpoint
Load balancingRound-robin, least-latency, weighted, priority across deployments
Automatic failoverRetry on 5xx/timeout, circuit breakers, health-aware routing
Web UIDashboard, playground, API keys, teams, models, usage, settings
RBACOrg > Team > User > Key hierarchy, 4 roles
Rate limitsRequests per minute/day, most-restrictive-wins across levels
Token budgetsDaily/monthly limits, real-time enforcement
Usage trackingTokens, cost, duration, TTFT per request
Usage exportCSV / JSON download
Model aliasesClients call default, you control where it routes
MCP gatewayProxy external MCP servers with access control and session management
Code ModeWASM-sandboxed JS for multi-tool orchestration
Prometheus metricsLatency, tokens, active streams, routing, health
DatabaseSQLite (default) or PostgreSQL
DeploymentDocker, Helm chart, graceful shutdown
Pro (€49/mo · €490/yr)Everything above, plus:
Unlimited orgs + teamsNo limit on organizations or teams
Cost reportsModel breakdown, daily trends, budget alerts
Cross-org analyticsUsage and cost across all organizations
SupportPriority email (48h)
Enterprise (€149/mo · €1490/yr)Everything in Pro, plus:
SSO / OIDCGoogle, Azure AD, Okta, Keycloak, any provider
Per-org SSOEach organization gets its own Identity Provider
Auto-provisioningUsers created from allowed email domains
Group syncOIDC groups mapped to VoidLLM teams
Audit logsEvery admin action, filterable API + UI
OpenTelemetryOTLP/gRPC export, request ID correlation
Multi-instanceRedis-backed rate limits and budgets across replicas
SupportDedicated Slack (24h)

Founding Member (€999 one-time): All Enterprise features (current and future), lifetime license, Product Advisory Board, direct founder access, priority support, early access. Limited spots.

Flat pricing - no per-user fees, no per-request charges. Self-hosted on your infrastructure.


MCP Gateway

VoidLLM is an MCP gateway - it exposes built-in management tools and proxies requests to external MCP servers with access control, usage tracking, and automatic session management.

Built-in Tools

ToolDescription
list_modelsList models with health status (RBAC-scoped)
get_model_healthHealth status for a specific model or deployment
get_usageUsage stats for your key/team/org
list_keysAPI keys visible to you
create_keyCreate a temporary API key
list_deploymentsDeployment details (system_admin only)

External MCP Servers

Register external MCP servers via the Admin UI or API. VoidLLM proxies tool calls through /api/v1/mcp/:alias with scoped access control (global, org, or team level), automatic session management, usage tracking, and Prometheus metrics.

Code Mode

Code Mode lets LLMs write JavaScript that orchestrates multiple MCP tool calls in a single execution - instead of one tool call per LLM turn. The JS runs in a WASM-sandboxed QuickJS runtime with no filesystem, no network, and no host access. Reduces token usage by 30-80%.

mcp:
code_mode:
enabled: truepool_size: 8# concurrent WASM runtimesmemory_limit_mb: 16# per executiontimeout: 30s# per executionmax_tool_calls: 50# per execution

Code Mode exposes three tools on /api/v1/mcp:

ToolDescription
list_serversDiscover available MCP servers and tool counts
search_toolsFind tools by keyword across all servers
execute_codeRun JS with MCP tools as await tools.alias.toolName(args)

TypeScript type declarations are auto-generated from tool schemas and included in the execute_code description, so LLMs see available tools and argument types at tools/list time.

Admins can block specific tools from Code Mode via the per-tool blocklist API and UI.

IDE Setup

{
"mcpServers": {
"voidllm": {
"type": "http",
"url": "http://your-voidllm-instance:8080/api/v1/mcp",
"headers": { "Authorization": "Bearer vl_uk_your_key" }
}
}
}

This connects your IDE (Claude Code, Cursor, Windsurf) to the Code Mode endpoint. Management tools (list_models, get_usage, etc.) are available at /api/v1/mcp/voidllm. External MCP servers at /api/v1/mcp/:alias.

Known Limitations

  • SSE transport not supported - MCP servers using the deprecated SSE protocol (pre 2025-03-26 spec) are auto-detected and deactivated. Use servers that support Streamable HTTP.
  • No OAuth for upstream MCP servers - servers requiring per-user OAuth (Jira, Slack, Google) are not yet supported. API key and header auth work.
  • Single instance only - Code Mode's WASM runtime pool is in-memory. Multi-pod deployments require Redis support (coming soon).

Documentation

Full documentation | Blog | FAQ

TopicGuide
Getting StartedQuick Start
ConfigurationAll YAML settings
DockerDocker deployment
KubernetesHelm chart
ProvidersOpenAI, Anthropic, Azure, Ollama, vLLM
Load BalancingStrategies, failover, circuit breakers
MCP GatewayOverview - Servers - Code Mode - IDE Setup
RBACRoles and permissions
PrivacyZero-knowledge architecture
API ReferenceEndpoints and error codes
EnterpriseLicense - SSO - Audit - OTel - Pricing
TroubleshootingCommon issues

Configuration

server:
proxy:
port: 8080models:
# Single endpoint
- name: dolphin-mistralprovider: ollamabase_url: http://localhost:11434/v1timeout: 30saliases: [default]pricing:
input_per_1m: 0.15output_per_1m: 0.60# Load balanced - multiple deployments with failover
- name: gpt-4ostrategy: round-robinaliases: [smart]deployments:
- name: azure-eastprovider: azurebase_url: https://eastus.openai.azure.comapi_key: ${AZURE_EAST_KEY}azure_deployment: gpt-4opriority: 1
- name: openai-fallbackprovider: openaibase_url: https://api.openai.com/v1api_key: ${OPENAI_KEY}priority: 2mcp_servers:
- name: AWS Knowledgealias: awsurl: https://knowledge-mcp.global.api.awsauth_type: nonesettings:
admin_key: ${VOIDLLM_ADMIN_KEY}encryption_key: ${VOIDLLM_ENCRYPTION_KEY}mcp:
code_mode:
enabled: true

Supported providers: openai · anthropic · azure · vllm · ollama · custom

Environment variables are interpolated with ${VAR} syntax. Secrets never hardcoded.

Deployment

Docker Compose

cp voidllm.yaml.example voidllm.yaml
export VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)
docker-compose up

Kubernetes (Helm)

helm install voidllm chart/voidllm/ \
--set secrets.adminKey=$(openssl rand -base64 32) \
--set secrets.encryptionKey=$(openssl rand -base64 32) \
--set config.models[0].name=my-model \
--set config.models[0].provider=ollama \
--set config.models[0].base_url=http://ollama:11434/v1

PostgreSQL and Redis are available as optional subcharts for production deployments.

From Source

# Prerequisites: Go 1.23+, Node 20+cd ui && npm ci && npm run build &&cd ..
go run ./cmd/voidllm --config voidllm.yaml

Production Checklist

  • Use PostgreSQL instead of SQLite
  • Put VoidLLM behind TLS / a reverse proxy
  • Isolate the admin UI/API from public proxy traffic (separate admin.port, with TLS)
  • Use a strong VOIDLLM_ENCRYPTION_KEY (32+ bytes) and keep it in a secrets manager
  • Don't use VOIDLLM_ADMIN_KEY as a production API key - it's for bootstrap only
  • Set resource limits and network policies in Kubernetes
  • Scrape /metrics with Prometheus
  • Configure database backups
  • For multiple replicas, use Redis so rate limits and budgets are shared (they are per-process without it) - Enterprise

See the Security Hardening guide for the full list.

Privacy

This is not a feature toggle. It's an architectural decision that makes VoidLLM a privacy-first LLM proxy.

  • No request body in logs, DB, or any persistent storage
  • No response body in logs, DB, or any persistent storage
  • No prompt caching - content passes through memory only
  • Usage events contain only: who (key/org/team), what (model), how much (tokens/cost)
  • There is no enable_content_logging option. It doesn't exist.
  • Designed to support GDPR compliance - no personal data in prompts is stored or processed

CLI Tools

# Bidirectional database migration
voidllm migrate --from sqlite:///data/voidllm.db --to postgres://user:pass@host/db
# License management (for Enterprise)
voidllm license verify < license.jwt

Project

License

Business Source License 1.1 - source available, self-hosting permitted, competing hosted services prohibited. Converts to Apache 2.0 four years after each release.


Built by VoidMind · voidllm.ai

This project was built with significant assistance from AI (Claude by Anthropic).

About

Privacy-first LLM proxy and AI gateway - load balancing, multi-provider routing, API key management, usage tracking, rate limiting. Self-hosted. Zero knowledge of your prompts.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

130 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

VoidLLM

CIcodecovGo Report CardArtifact HubOpenSSF ScorecardSnykReleaseGoLicense: BSL 1.1

A privacy-first LLM proxy and AI gateway for teams that take control seriously.

VoidLLM is a self-hosted LLM proxy that sits between your applications and LLM providers - OpenAI, Anthropic, Azure, Ollama, vLLM, or any custom endpoint. It gives you organization-wide access control, API key management, usage tracking, rate limiting, and multi-deployment load balancing. One Go binary, sub-2ms proxy overhead, zero knowledge of your prompts.

VoidLLM Dashboard

More screenshots

Usage AnalyticsAPI KeysPlayground

Privacy-First by Design: VoidLLM is a zero-knowledge LLM proxy - it never stores, logs, or persists any prompt or response content. Not as a setting you can toggle - by architecture. Only metadata is tracked: who made the request, which model, how many tokens, how long it took. Your data stays yours.


Why VoidLLM?

ProblemHow VoidLLM solves it
Teams share raw API keys in SlackVirtual keys with org/team/user scoping and RBAC
No visibility into who's spending whatPer-key, per-team, per-org usage tracking + cost estimation
One runaway script burns the monthly budgetRate limits + token budgets enforced by the proxy at every level
Switching providers means changing every appModel aliases - clients call default, the proxy routes it anywhere
Provider goes down, everything breaksMulti-deployment load balancing with automatic failover
Existing proxies log your promptsZero-knowledge proxy architecture - content never touches disk

How it works

flowchart LR
App[Your app / SDK] -->|OpenAI-compatible| Proxy[VoidLLM proxy]
Proxy --> Gate[API key + RBAC<br/>rate limits + budgets]
Gate --> Router[Model alias + load balancing]
Router --> Providers[OpenAI / Anthropic / Azure<br/>Ollama / vLLM / custom]
Proxy -. metadata only .-> DB[(SQLite / PostgreSQL)]
Loading

Your apps speak the OpenAI API to VoidLLM. It authenticates the key, applies RBAC, rate limits and budgets, resolves the model alias, and routes to the right provider. Only metadata - who called, which model, token counts, latency - is written to the database. Prompt and response content passes through memory and is never persisted.

Who it's for

A good fit if you:

  • Self-host LLM infrastructure (vLLM, Ollama) or use managed providers and need one control plane
  • Cannot log prompts or responses for privacy or compliance reasons
  • Need org/team/user/key RBAC, budgets, and model routing
  • Run multiple providers and want aliases, load balancing, and failover

Not the right fit if you:

  • Want a hosted SaaS gateway - VoidLLM is self-hosted by design
  • Need full prompt/response logging or content-level observability - it's zero-knowledge by architecture
  • Need upstream MCP servers with per-user OAuth today - not yet supported

Quick Start

# Generate required keysexport VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)# Start the proxy - no config file needed, VoidLLM boots with sensible defaults
docker run -p 8080:8080 \
-e VOIDLLM_ADMIN_KEY -e VOIDLLM_ENCRYPTION_KEY \
-v voidllm_data:/data \
ghcr.io/voidmind-io/voidllm:latest

On first start VoidLLM prints bootstrap credentials to stdout (shown below) - no config file is required. Add models in the UI, or mount a voidllm.yaml to declare them (see Configuration).

Binary (no Docker needed)

Download the latest binary for your platform from the releases page:

# Linux
curl -sL https://github.com/voidmind-io/voidllm/releases/latest/download/voidllm-linux-amd64.tar.gz | tar xz
export VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)
./voidllm

Available for: Linux (amd64, arm64), Windows (amd64, arm64), macOS (amd64, arm64).

On first start, VoidLLM prints your credentials to stdout:

========================================
BOOTSTRAP COMPLETE - COPY THESE NOW
========================================
API Key: vl_uk_a3f2...
Email: admin@voidllm.local
Password: <random>
========================================

Open http://localhost:8080, log in with the email and password above, and start proxying. The API key is used for SDK calls (Authorization: Bearer vl_uk_...). These credentials are shown once - save them.

One-Click Deploy

Deploy on Railway

Keys are auto-generated. Open the URL Railway gives you and start adding models.

# Your apps just point at the proxy instead of the provider
curl http://localhost:8080/v1/chat/completions \
-H "Authorization: Bearer vl_uk_..." \
-H "Content-Type: application/json" \
-d '{"model":"default","messages":[{"role":"user","content":"hello"}]}'

Any OpenAI-compatible SDK works out of the box - just change the base URL to your VoidLLM proxy.

Features

FeatureDetails
OpenAI-compatible proxy/v1/chat/completions, embeddings, images, audio, streaming
Multi-provider routingOpenAI, Anthropic, Azure, Ollama, vLLM, any custom endpoint
Load balancingRound-robin, least-latency, weighted, priority across deployments
Automatic failoverRetry on 5xx/timeout, circuit breakers, health-aware routing
Web UIDashboard, playground, API keys, teams, models, usage, settings
RBACOrg > Team > User > Key hierarchy, 4 roles
Rate limitsRequests per minute/day, most-restrictive-wins across levels
Token budgetsDaily/monthly limits, real-time enforcement
Usage trackingTokens, cost, duration, TTFT per request
Usage exportCSV / JSON download
Model aliasesClients call default, you control where it routes
MCP gatewayProxy external MCP servers with access control and session management
Code ModeWASM-sandboxed JS for multi-tool orchestration
Prometheus metricsLatency, tokens, active streams, routing, health
DatabaseSQLite (default) or PostgreSQL
DeploymentDocker, Helm chart, graceful shutdown
Pro (€49/mo · €490/yr)Everything above, plus:
Unlimited orgs + teamsNo limit on organizations or teams
Cost reportsModel breakdown, daily trends, budget alerts
Cross-org analyticsUsage and cost across all organizations
SupportPriority email (48h)
Enterprise (€149/mo · €1490/yr)Everything in Pro, plus:
SSO / OIDCGoogle, Azure AD, Okta, Keycloak, any provider
Per-org SSOEach organization gets its own Identity Provider
Auto-provisioningUsers created from allowed email domains
Group syncOIDC groups mapped to VoidLLM teams
Audit logsEvery admin action, filterable API + UI
OpenTelemetryOTLP/gRPC export, request ID correlation
Multi-instanceRedis-backed rate limits and budgets across replicas
SupportDedicated Slack (24h)

Founding Member (€999 one-time): All Enterprise features (current and future), lifetime license, Product Advisory Board, direct founder access, priority support, early access. Limited spots.

Flat pricing - no per-user fees, no per-request charges. Self-hosted on your infrastructure.


MCP Gateway

VoidLLM is an MCP gateway - it exposes built-in management tools and proxies requests to external MCP servers with access control, usage tracking, and automatic session management.

Built-in Tools

ToolDescription
list_modelsList models with health status (RBAC-scoped)
get_model_healthHealth status for a specific model or deployment
get_usageUsage stats for your key/team/org
list_keysAPI keys visible to you
create_keyCreate a temporary API key
list_deploymentsDeployment details (system_admin only)

External MCP Servers

Register external MCP servers via the Admin UI or API. VoidLLM proxies tool calls through /api/v1/mcp/:alias with scoped access control (global, org, or team level), automatic session management, usage tracking, and Prometheus metrics.

Code Mode

Code Mode lets LLMs write JavaScript that orchestrates multiple MCP tool calls in a single execution - instead of one tool call per LLM turn. The JS runs in a WASM-sandboxed QuickJS runtime with no filesystem, no network, and no host access. Reduces token usage by 30-80%.

mcp:
code_mode:
enabled: truepool_size: 8# concurrent WASM runtimesmemory_limit_mb: 16# per executiontimeout: 30s# per executionmax_tool_calls: 50# per execution

Code Mode exposes three tools on /api/v1/mcp:

ToolDescription
list_serversDiscover available MCP servers and tool counts
search_toolsFind tools by keyword across all servers
execute_codeRun JS with MCP tools as await tools.alias.toolName(args)

TypeScript type declarations are auto-generated from tool schemas and included in the execute_code description, so LLMs see available tools and argument types at tools/list time.

Admins can block specific tools from Code Mode via the per-tool blocklist API and UI.

IDE Setup

{
"mcpServers": {
"voidllm": {
"type": "http",
"url": "http://your-voidllm-instance:8080/api/v1/mcp",
"headers": { "Authorization": "Bearer vl_uk_your_key" }
}
}
}

This connects your IDE (Claude Code, Cursor, Windsurf) to the Code Mode endpoint. Management tools (list_models, get_usage, etc.) are available at /api/v1/mcp/voidllm. External MCP servers at /api/v1/mcp/:alias.

Known Limitations

  • SSE transport not supported - MCP servers using the deprecated SSE protocol (pre 2025-03-26 spec) are auto-detected and deactivated. Use servers that support Streamable HTTP.
  • No OAuth for upstream MCP servers - servers requiring per-user OAuth (Jira, Slack, Google) are not yet supported. API key and header auth work.
  • Single instance only - Code Mode's WASM runtime pool is in-memory. Multi-pod deployments require Redis support (coming soon).

Documentation

Full documentation | Blog | FAQ

TopicGuide
Getting StartedQuick Start
ConfigurationAll YAML settings
DockerDocker deployment
KubernetesHelm chart
ProvidersOpenAI, Anthropic, Azure, Ollama, vLLM
Load BalancingStrategies, failover, circuit breakers
MCP GatewayOverview - Servers - Code Mode - IDE Setup
RBACRoles and permissions
PrivacyZero-knowledge architecture
API ReferenceEndpoints and error codes
EnterpriseLicense - SSO - Audit - OTel - Pricing
TroubleshootingCommon issues

Configuration

server:
proxy:
port: 8080models:
# Single endpoint
- name: dolphin-mistralprovider: ollamabase_url: http://localhost:11434/v1timeout: 30saliases: [default]pricing:
input_per_1m: 0.15output_per_1m: 0.60# Load balanced - multiple deployments with failover
- name: gpt-4ostrategy: round-robinaliases: [smart]deployments:
- name: azure-eastprovider: azurebase_url: https://eastus.openai.azure.comapi_key: ${AZURE_EAST_KEY}azure_deployment: gpt-4opriority: 1
- name: openai-fallbackprovider: openaibase_url: https://api.openai.com/v1api_key: ${OPENAI_KEY}priority: 2mcp_servers:
- name: AWS Knowledgealias: awsurl: https://knowledge-mcp.global.api.awsauth_type: nonesettings:
admin_key: ${VOIDLLM_ADMIN_KEY}encryption_key: ${VOIDLLM_ENCRYPTION_KEY}mcp:
code_mode:
enabled: true

Supported providers: openai · anthropic · azure · vllm · ollama · custom

Environment variables are interpolated with ${VAR} syntax. Secrets never hardcoded.

Deployment

Docker Compose

cp voidllm.yaml.example voidllm.yaml
export VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)
docker-compose up

Kubernetes (Helm)

helm install voidllm chart/voidllm/ \
--set secrets.adminKey=$(openssl rand -base64 32) \
--set secrets.encryptionKey=$(openssl rand -base64 32) \
--set config.models[0].name=my-model \
--set config.models[0].provider=ollama \
--set config.models[0].base_url=http://ollama:11434/v1

PostgreSQL and Redis are available as optional subcharts for production deployments.

From Source

# Prerequisites: Go 1.23+, Node 20+cd ui && npm ci && npm run build &&cd ..
go run ./cmd/voidllm --config voidllm.yaml

Production Checklist

  • Use PostgreSQL instead of SQLite
  • Put VoidLLM behind TLS / a reverse proxy
  • Isolate the admin UI/API from public proxy traffic (separate admin.port, with TLS)
  • Use a strong VOIDLLM_ENCRYPTION_KEY (32+ bytes) and keep it in a secrets manager
  • Don't use VOIDLLM_ADMIN_KEY as a production API key - it's for bootstrap only
  • Set resource limits and network policies in Kubernetes
  • Scrape /metrics with Prometheus
  • Configure database backups
  • For multiple replicas, use Redis so rate limits and budgets are shared (they are per-process without it) - Enterprise

See the Security Hardening guide for the full list.

Privacy

This is not a feature toggle. It's an architectural decision that makes VoidLLM a privacy-first LLM proxy.

  • No request body in logs, DB, or any persistent storage
  • No response body in logs, DB, or any persistent storage
  • No prompt caching - content passes through memory only
  • Usage events contain only: who (key/org/team), what (model), how much (tokens/cost)
  • There is no enable_content_logging option. It doesn't exist.
  • Designed to support GDPR compliance - no personal data in prompts is stored or processed

CLI Tools

# Bidirectional database migration
voidllm migrate --from sqlite:///data/voidllm.db --to postgres://user:pass@host/db
# License management (for Enterprise)
voidllm license verify < license.jwt

Project

License

Business Source License 1.1 - source available, self-hosting permitted, competing hosted services prohibited. Converts to Apache 2.0 four years after each release.


Built by VoidMind · voidllm.ai

This project was built with significant assistance from AI (Claude by Anthropic).

About

Privacy-first LLM proxy and AI gateway - load balancing, multi-provider routing, API key management, usage tracking, rate limiting. Self-hosted. Zero knowledge of your prompts.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

130 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

VoidLLM

CIcodecovGo Report CardArtifact HubOpenSSF ScorecardSnykReleaseGoLicense: BSL 1.1

A privacy-first LLM proxy and AI gateway for teams that take control seriously.

VoidLLM is a self-hosted LLM proxy that sits between your applications and LLM providers - OpenAI, Anthropic, Azure, Ollama, vLLM, or any custom endpoint. It gives you organization-wide access control, API key management, usage tracking, rate limiting, and multi-deployment load balancing. One Go binary, sub-2ms proxy overhead, zero knowledge of your prompts.

VoidLLM Dashboard

More screenshots

Usage AnalyticsAPI KeysPlayground

Privacy-First by Design: VoidLLM is a zero-knowledge LLM proxy - it never stores, logs, or persists any prompt or response content. Not as a setting you can toggle - by architecture. Only metadata is tracked: who made the request, which model, how many tokens, how long it took. Your data stays yours.


Why VoidLLM?

ProblemHow VoidLLM solves it
Teams share raw API keys in SlackVirtual keys with org/team/user scoping and RBAC
No visibility into who's spending whatPer-key, per-team, per-org usage tracking + cost estimation
One runaway script burns the monthly budgetRate limits + token budgets enforced by the proxy at every level
Switching providers means changing every appModel aliases - clients call default, the proxy routes it anywhere
Provider goes down, everything breaksMulti-deployment load balancing with automatic failover
Existing proxies log your promptsZero-knowledge proxy architecture - content never touches disk

How it works

flowchart LR
App[Your app / SDK] -->|OpenAI-compatible| Proxy[VoidLLM proxy]
Proxy --> Gate[API key + RBAC<br/>rate limits + budgets]
Gate --> Router[Model alias + load balancing]
Router --> Providers[OpenAI / Anthropic / Azure<br/>Ollama / vLLM / custom]
Proxy -. metadata only .-> DB[(SQLite / PostgreSQL)]
Loading

Your apps speak the OpenAI API to VoidLLM. It authenticates the key, applies RBAC, rate limits and budgets, resolves the model alias, and routes to the right provider. Only metadata - who called, which model, token counts, latency - is written to the database. Prompt and response content passes through memory and is never persisted.

Who it's for

A good fit if you:

  • Self-host LLM infrastructure (vLLM, Ollama) or use managed providers and need one control plane
  • Cannot log prompts or responses for privacy or compliance reasons
  • Need org/team/user/key RBAC, budgets, and model routing
  • Run multiple providers and want aliases, load balancing, and failover

Not the right fit if you:

  • Want a hosted SaaS gateway - VoidLLM is self-hosted by design
  • Need full prompt/response logging or content-level observability - it's zero-knowledge by architecture
  • Need upstream MCP servers with per-user OAuth today - not yet supported

Quick Start

# Generate required keysexport VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)# Start the proxy - no config file needed, VoidLLM boots with sensible defaults
docker run -p 8080:8080 \
-e VOIDLLM_ADMIN_KEY -e VOIDLLM_ENCRYPTION_KEY \
-v voidllm_data:/data \
ghcr.io/voidmind-io/voidllm:latest

On first start VoidLLM prints bootstrap credentials to stdout (shown below) - no config file is required. Add models in the UI, or mount a voidllm.yaml to declare them (see Configuration).

Binary (no Docker needed)

Download the latest binary for your platform from the releases page:

# Linux
curl -sL https://github.com/voidmind-io/voidllm/releases/latest/download/voidllm-linux-amd64.tar.gz | tar xz
export VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)
./voidllm

Available for: Linux (amd64, arm64), Windows (amd64, arm64), macOS (amd64, arm64).

On first start, VoidLLM prints your credentials to stdout:

========================================
BOOTSTRAP COMPLETE - COPY THESE NOW
========================================
API Key: vl_uk_a3f2...
Email: admin@voidllm.local
Password: <random>
========================================

Open http://localhost:8080, log in with the email and password above, and start proxying. The API key is used for SDK calls (Authorization: Bearer vl_uk_...). These credentials are shown once - save them.

One-Click Deploy

Deploy on Railway

Keys are auto-generated. Open the URL Railway gives you and start adding models.

# Your apps just point at the proxy instead of the provider
curl http://localhost:8080/v1/chat/completions \
-H "Authorization: Bearer vl_uk_..." \
-H "Content-Type: application/json" \
-d '{"model":"default","messages":[{"role":"user","content":"hello"}]}'

Any OpenAI-compatible SDK works out of the box - just change the base URL to your VoidLLM proxy.

Features

FeatureDetails
OpenAI-compatible proxy/v1/chat/completions, embeddings, images, audio, streaming
Multi-provider routingOpenAI, Anthropic, Azure, Ollama, vLLM, any custom endpoint
Load balancingRound-robin, least-latency, weighted, priority across deployments
Automatic failoverRetry on 5xx/timeout, circuit breakers, health-aware routing
Web UIDashboard, playground, API keys, teams, models, usage, settings
RBACOrg > Team > User > Key hierarchy, 4 roles
Rate limitsRequests per minute/day, most-restrictive-wins across levels
Token budgetsDaily/monthly limits, real-time enforcement
Usage trackingTokens, cost, duration, TTFT per request
Usage exportCSV / JSON download
Model aliasesClients call default, you control where it routes
MCP gatewayProxy external MCP servers with access control and session management
Code ModeWASM-sandboxed JS for multi-tool orchestration
Prometheus metricsLatency, tokens, active streams, routing, health
DatabaseSQLite (default) or PostgreSQL
DeploymentDocker, Helm chart, graceful shutdown
Pro (€49/mo · €490/yr)Everything above, plus:
Unlimited orgs + teamsNo limit on organizations or teams
Cost reportsModel breakdown, daily trends, budget alerts
Cross-org analyticsUsage and cost across all organizations
SupportPriority email (48h)
Enterprise (€149/mo · €1490/yr)Everything in Pro, plus:
SSO / OIDCGoogle, Azure AD, Okta, Keycloak, any provider
Per-org SSOEach organization gets its own Identity Provider
Auto-provisioningUsers created from allowed email domains
Group syncOIDC groups mapped to VoidLLM teams
Audit logsEvery admin action, filterable API + UI
OpenTelemetryOTLP/gRPC export, request ID correlation
Multi-instanceRedis-backed rate limits and budgets across replicas
SupportDedicated Slack (24h)

Founding Member (€999 one-time): All Enterprise features (current and future), lifetime license, Product Advisory Board, direct founder access, priority support, early access. Limited spots.

Flat pricing - no per-user fees, no per-request charges. Self-hosted on your infrastructure.


MCP Gateway

VoidLLM is an MCP gateway - it exposes built-in management tools and proxies requests to external MCP servers with access control, usage tracking, and automatic session management.

Built-in Tools

ToolDescription
list_modelsList models with health status (RBAC-scoped)
get_model_healthHealth status for a specific model or deployment
get_usageUsage stats for your key/team/org
list_keysAPI keys visible to you
create_keyCreate a temporary API key
list_deploymentsDeployment details (system_admin only)

External MCP Servers

Register external MCP servers via the Admin UI or API. VoidLLM proxies tool calls through /api/v1/mcp/:alias with scoped access control (global, org, or team level), automatic session management, usage tracking, and Prometheus metrics.

Code Mode

Code Mode lets LLMs write JavaScript that orchestrates multiple MCP tool calls in a single execution - instead of one tool call per LLM turn. The JS runs in a WASM-sandboxed QuickJS runtime with no filesystem, no network, and no host access. Reduces token usage by 30-80%.

mcp:
code_mode:
enabled: truepool_size: 8# concurrent WASM runtimesmemory_limit_mb: 16# per executiontimeout: 30s# per executionmax_tool_calls: 50# per execution

Code Mode exposes three tools on /api/v1/mcp:

ToolDescription
list_serversDiscover available MCP servers and tool counts
search_toolsFind tools by keyword across all servers
execute_codeRun JS with MCP tools as await tools.alias.toolName(args)

TypeScript type declarations are auto-generated from tool schemas and included in the execute_code description, so LLMs see available tools and argument types at tools/list time.

Admins can block specific tools from Code Mode via the per-tool blocklist API and UI.

IDE Setup

{
"mcpServers": {
"voidllm": {
"type": "http",
"url": "http://your-voidllm-instance:8080/api/v1/mcp",
"headers": { "Authorization": "Bearer vl_uk_your_key" }
}
}
}

This connects your IDE (Claude Code, Cursor, Windsurf) to the Code Mode endpoint. Management tools (list_models, get_usage, etc.) are available at /api/v1/mcp/voidllm. External MCP servers at /api/v1/mcp/:alias.

Known Limitations

  • SSE transport not supported - MCP servers using the deprecated SSE protocol (pre 2025-03-26 spec) are auto-detected and deactivated. Use servers that support Streamable HTTP.
  • No OAuth for upstream MCP servers - servers requiring per-user OAuth (Jira, Slack, Google) are not yet supported. API key and header auth work.
  • Single instance only - Code Mode's WASM runtime pool is in-memory. Multi-pod deployments require Redis support (coming soon).

Documentation

Full documentation | Blog | FAQ

TopicGuide
Getting StartedQuick Start
ConfigurationAll YAML settings
DockerDocker deployment
KubernetesHelm chart
ProvidersOpenAI, Anthropic, Azure, Ollama, vLLM
Load BalancingStrategies, failover, circuit breakers
MCP GatewayOverview - Servers - Code Mode - IDE Setup
RBACRoles and permissions
PrivacyZero-knowledge architecture
API ReferenceEndpoints and error codes
EnterpriseLicense - SSO - Audit - OTel - Pricing
TroubleshootingCommon issues

Configuration

server:
proxy:
port: 8080models:
# Single endpoint
- name: dolphin-mistralprovider: ollamabase_url: http://localhost:11434/v1timeout: 30saliases: [default]pricing:
input_per_1m: 0.15output_per_1m: 0.60# Load balanced - multiple deployments with failover
- name: gpt-4ostrategy: round-robinaliases: [smart]deployments:
- name: azure-eastprovider: azurebase_url: https://eastus.openai.azure.comapi_key: ${AZURE_EAST_KEY}azure_deployment: gpt-4opriority: 1
- name: openai-fallbackprovider: openaibase_url: https://api.openai.com/v1api_key: ${OPENAI_KEY}priority: 2mcp_servers:
- name: AWS Knowledgealias: awsurl: https://knowledge-mcp.global.api.awsauth_type: nonesettings:
admin_key: ${VOIDLLM_ADMIN_KEY}encryption_key: ${VOIDLLM_ENCRYPTION_KEY}mcp:
code_mode:
enabled: true

Supported providers: openai · anthropic · azure · vllm · ollama · custom

Environment variables are interpolated with ${VAR} syntax. Secrets never hardcoded.

Deployment

Docker Compose

cp voidllm.yaml.example voidllm.yaml
export VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)
docker-compose up

Kubernetes (Helm)

helm install voidllm chart/voidllm/ \
--set secrets.adminKey=$(openssl rand -base64 32) \
--set secrets.encryptionKey=$(openssl rand -base64 32) \
--set config.models[0].name=my-model \
--set config.models[0].provider=ollama \
--set config.models[0].base_url=http://ollama:11434/v1

PostgreSQL and Redis are available as optional subcharts for production deployments.

From Source

# Prerequisites: Go 1.23+, Node 20+cd ui && npm ci && npm run build &&cd ..
go run ./cmd/voidllm --config voidllm.yaml

Production Checklist

  • Use PostgreSQL instead of SQLite
  • Put VoidLLM behind TLS / a reverse proxy
  • Isolate the admin UI/API from public proxy traffic (separate admin.port, with TLS)
  • Use a strong VOIDLLM_ENCRYPTION_KEY (32+ bytes) and keep it in a secrets manager
  • Don't use VOIDLLM_ADMIN_KEY as a production API key - it's for bootstrap only
  • Set resource limits and network policies in Kubernetes
  • Scrape /metrics with Prometheus
  • Configure database backups
  • For multiple replicas, use Redis so rate limits and budgets are shared (they are per-process without it) - Enterprise

See the Security Hardening guide for the full list.

Privacy

This is not a feature toggle. It's an architectural decision that makes VoidLLM a privacy-first LLM proxy.

  • No request body in logs, DB, or any persistent storage
  • No response body in logs, DB, or any persistent storage
  • No prompt caching - content passes through memory only
  • Usage events contain only: who (key/org/team), what (model), how much (tokens/cost)
  • There is no enable_content_logging option. It doesn't exist.
  • Designed to support GDPR compliance - no personal data in prompts is stored or processed

CLI Tools

# Bidirectional database migration
voidllm migrate --from sqlite:///data/voidllm.db --to postgres://user:pass@host/db
# License management (for Enterprise)
voidllm license verify < license.jwt

Project

License

Business Source License 1.1 - source available, self-hosting permitted, competing hosted services prohibited. Converts to Apache 2.0 four years after each release.


Built by VoidMind · voidllm.ai

This project was built with significant assistance from AI (Claude by Anthropic).

About

Privacy-first LLM proxy and AI gateway - load balancing, multi-provider routing, API key management, usage tracking, rate limiting. Self-hosted. Zero knowledge of your prompts.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

130 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

VoidLLM

CIcodecovGo Report CardArtifact HubOpenSSF ScorecardSnykReleaseGoLicense: BSL 1.1

A privacy-first LLM proxy and AI gateway for teams that take control seriously.

VoidLLM is a self-hosted LLM proxy that sits between your applications and LLM providers - OpenAI, Anthropic, Azure, Ollama, vLLM, or any custom endpoint. It gives you organization-wide access control, API key management, usage tracking, rate limiting, and multi-deployment load balancing. One Go binary, sub-2ms proxy overhead, zero knowledge of your prompts.

VoidLLM Dashboard

More screenshots

Usage AnalyticsAPI KeysPlayground

Privacy-First by Design: VoidLLM is a zero-knowledge LLM proxy - it never stores, logs, or persists any prompt or response content. Not as a setting you can toggle - by architecture. Only metadata is tracked: who made the request, which model, how many tokens, how long it took. Your data stays yours.


Why VoidLLM?

ProblemHow VoidLLM solves it
Teams share raw API keys in SlackVirtual keys with org/team/user scoping and RBAC
No visibility into who's spending whatPer-key, per-team, per-org usage tracking + cost estimation
One runaway script burns the monthly budgetRate limits + token budgets enforced by the proxy at every level
Switching providers means changing every appModel aliases - clients call default, the proxy routes it anywhere
Provider goes down, everything breaksMulti-deployment load balancing with automatic failover
Existing proxies log your promptsZero-knowledge proxy architecture - content never touches disk

How it works

flowchart LR
App[Your app / SDK] -->|OpenAI-compatible| Proxy[VoidLLM proxy]
Proxy --> Gate[API key + RBAC<br/>rate limits + budgets]
Gate --> Router[Model alias + load balancing]
Router --> Providers[OpenAI / Anthropic / Azure<br/>Ollama / vLLM / custom]
Proxy -. metadata only .-> DB[(SQLite / PostgreSQL)]
Loading

Your apps speak the OpenAI API to VoidLLM. It authenticates the key, applies RBAC, rate limits and budgets, resolves the model alias, and routes to the right provider. Only metadata - who called, which model, token counts, latency - is written to the database. Prompt and response content passes through memory and is never persisted.

Who it's for

A good fit if you:

  • Self-host LLM infrastructure (vLLM, Ollama) or use managed providers and need one control plane
  • Cannot log prompts or responses for privacy or compliance reasons
  • Need org/team/user/key RBAC, budgets, and model routing
  • Run multiple providers and want aliases, load balancing, and failover

Not the right fit if you:

  • Want a hosted SaaS gateway - VoidLLM is self-hosted by design
  • Need full prompt/response logging or content-level observability - it's zero-knowledge by architecture
  • Need upstream MCP servers with per-user OAuth today - not yet supported

Quick Start

# Generate required keysexport VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)# Start the proxy - no config file needed, VoidLLM boots with sensible defaults
docker run -p 8080:8080 \
-e VOIDLLM_ADMIN_KEY -e VOIDLLM_ENCRYPTION_KEY \
-v voidllm_data:/data \
ghcr.io/voidmind-io/voidllm:latest

On first start VoidLLM prints bootstrap credentials to stdout (shown below) - no config file is required. Add models in the UI, or mount a voidllm.yaml to declare them (see Configuration).

Binary (no Docker needed)

Download the latest binary for your platform from the releases page:

# Linux
curl -sL https://github.com/voidmind-io/voidllm/releases/latest/download/voidllm-linux-amd64.tar.gz | tar xz
export VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)
./voidllm

Available for: Linux (amd64, arm64), Windows (amd64, arm64), macOS (amd64, arm64).

On first start, VoidLLM prints your credentials to stdout:

========================================
BOOTSTRAP COMPLETE - COPY THESE NOW
========================================
API Key: vl_uk_a3f2...
Email: admin@voidllm.local
Password: <random>
========================================

Open http://localhost:8080, log in with the email and password above, and start proxying. The API key is used for SDK calls (Authorization: Bearer vl_uk_...). These credentials are shown once - save them.

One-Click Deploy

Deploy on Railway

Keys are auto-generated. Open the URL Railway gives you and start adding models.

# Your apps just point at the proxy instead of the provider
curl http://localhost:8080/v1/chat/completions \
-H "Authorization: Bearer vl_uk_..." \
-H "Content-Type: application/json" \
-d '{"model":"default","messages":[{"role":"user","content":"hello"}]}'

Any OpenAI-compatible SDK works out of the box - just change the base URL to your VoidLLM proxy.

Features

FeatureDetails
OpenAI-compatible proxy/v1/chat/completions, embeddings, images, audio, streaming
Multi-provider routingOpenAI, Anthropic, Azure, Ollama, vLLM, any custom endpoint
Load balancingRound-robin, least-latency, weighted, priority across deployments
Automatic failoverRetry on 5xx/timeout, circuit breakers, health-aware routing
Web UIDashboard, playground, API keys, teams, models, usage, settings
RBACOrg > Team > User > Key hierarchy, 4 roles
Rate limitsRequests per minute/day, most-restrictive-wins across levels
Token budgetsDaily/monthly limits, real-time enforcement
Usage trackingTokens, cost, duration, TTFT per request
Usage exportCSV / JSON download
Model aliasesClients call default, you control where it routes
MCP gatewayProxy external MCP servers with access control and session management
Code ModeWASM-sandboxed JS for multi-tool orchestration
Prometheus metricsLatency, tokens, active streams, routing, health
DatabaseSQLite (default) or PostgreSQL
DeploymentDocker, Helm chart, graceful shutdown
Pro (€49/mo · €490/yr)Everything above, plus:
Unlimited orgs + teamsNo limit on organizations or teams
Cost reportsModel breakdown, daily trends, budget alerts
Cross-org analyticsUsage and cost across all organizations
SupportPriority email (48h)
Enterprise (€149/mo · €1490/yr)Everything in Pro, plus:
SSO / OIDCGoogle, Azure AD, Okta, Keycloak, any provider
Per-org SSOEach organization gets its own Identity Provider
Auto-provisioningUsers created from allowed email domains
Group syncOIDC groups mapped to VoidLLM teams
Audit logsEvery admin action, filterable API + UI
OpenTelemetryOTLP/gRPC export, request ID correlation
Multi-instanceRedis-backed rate limits and budgets across replicas
SupportDedicated Slack (24h)

Founding Member (€999 one-time): All Enterprise features (current and future), lifetime license, Product Advisory Board, direct founder access, priority support, early access. Limited spots.

Flat pricing - no per-user fees, no per-request charges. Self-hosted on your infrastructure.


MCP Gateway

VoidLLM is an MCP gateway - it exposes built-in management tools and proxies requests to external MCP servers with access control, usage tracking, and automatic session management.

Built-in Tools

ToolDescription
list_modelsList models with health status (RBAC-scoped)
get_model_healthHealth status for a specific model or deployment
get_usageUsage stats for your key/team/org
list_keysAPI keys visible to you
create_keyCreate a temporary API key
list_deploymentsDeployment details (system_admin only)

External MCP Servers

Register external MCP servers via the Admin UI or API. VoidLLM proxies tool calls through /api/v1/mcp/:alias with scoped access control (global, org, or team level), automatic session management, usage tracking, and Prometheus metrics.

Code Mode

Code Mode lets LLMs write JavaScript that orchestrates multiple MCP tool calls in a single execution - instead of one tool call per LLM turn. The JS runs in a WASM-sandboxed QuickJS runtime with no filesystem, no network, and no host access. Reduces token usage by 30-80%.

mcp:
code_mode:
enabled: truepool_size: 8# concurrent WASM runtimesmemory_limit_mb: 16# per executiontimeout: 30s# per executionmax_tool_calls: 50# per execution

Code Mode exposes three tools on /api/v1/mcp:

ToolDescription
list_serversDiscover available MCP servers and tool counts
search_toolsFind tools by keyword across all servers
execute_codeRun JS with MCP tools as await tools.alias.toolName(args)

TypeScript type declarations are auto-generated from tool schemas and included in the execute_code description, so LLMs see available tools and argument types at tools/list time.

Admins can block specific tools from Code Mode via the per-tool blocklist API and UI.

IDE Setup

{
"mcpServers": {
"voidllm": {
"type": "http",
"url": "http://your-voidllm-instance:8080/api/v1/mcp",
"headers": { "Authorization": "Bearer vl_uk_your_key" }
}
}
}

This connects your IDE (Claude Code, Cursor, Windsurf) to the Code Mode endpoint. Management tools (list_models, get_usage, etc.) are available at /api/v1/mcp/voidllm. External MCP servers at /api/v1/mcp/:alias.

Known Limitations

  • SSE transport not supported - MCP servers using the deprecated SSE protocol (pre 2025-03-26 spec) are auto-detected and deactivated. Use servers that support Streamable HTTP.
  • No OAuth for upstream MCP servers - servers requiring per-user OAuth (Jira, Slack, Google) are not yet supported. API key and header auth work.
  • Single instance only - Code Mode's WASM runtime pool is in-memory. Multi-pod deployments require Redis support (coming soon).

Documentation

Full documentation | Blog | FAQ

TopicGuide
Getting StartedQuick Start
ConfigurationAll YAML settings
DockerDocker deployment
KubernetesHelm chart
ProvidersOpenAI, Anthropic, Azure, Ollama, vLLM
Load BalancingStrategies, failover, circuit breakers
MCP GatewayOverview - Servers - Code Mode - IDE Setup
RBACRoles and permissions
PrivacyZero-knowledge architecture
API ReferenceEndpoints and error codes
EnterpriseLicense - SSO - Audit - OTel - Pricing
TroubleshootingCommon issues

Configuration

server:
proxy:
port: 8080models:
# Single endpoint
- name: dolphin-mistralprovider: ollamabase_url: http://localhost:11434/v1timeout: 30saliases: [default]pricing:
input_per_1m: 0.15output_per_1m: 0.60# Load balanced - multiple deployments with failover
- name: gpt-4ostrategy: round-robinaliases: [smart]deployments:
- name: azure-eastprovider: azurebase_url: https://eastus.openai.azure.comapi_key: ${AZURE_EAST_KEY}azure_deployment: gpt-4opriority: 1
- name: openai-fallbackprovider: openaibase_url: https://api.openai.com/v1api_key: ${OPENAI_KEY}priority: 2mcp_servers:
- name: AWS Knowledgealias: awsurl: https://knowledge-mcp.global.api.awsauth_type: nonesettings:
admin_key: ${VOIDLLM_ADMIN_KEY}encryption_key: ${VOIDLLM_ENCRYPTION_KEY}mcp:
code_mode:
enabled: true

Supported providers: openai · anthropic · azure · vllm · ollama · custom

Environment variables are interpolated with ${VAR} syntax. Secrets never hardcoded.

Deployment

Docker Compose

cp voidllm.yaml.example voidllm.yaml
export VOIDLLM_ADMIN_KEY=$(openssl rand -base64 32)export VOIDLLM_ENCRYPTION_KEY=$(openssl rand -base64 32)
docker-compose up

Kubernetes (Helm)

helm install voidllm chart/voidllm/ \
--set secrets.adminKey=$(openssl rand -base64 32) \
--set secrets.encryptionKey=$(openssl rand -base64 32) \
--set config.models[0].name=my-model \
--set config.models[0].provider=ollama \
--set config.models[0].base_url=http://ollama:11434/v1

PostgreSQL and Redis are available as optional subcharts for production deployments.

From Source

# Prerequisites: Go 1.23+, Node 20+cd ui && npm ci && npm run build &&cd ..
go run ./cmd/voidllm --config voidllm.yaml

Production Checklist

  • Use PostgreSQL instead of SQLite
  • Put VoidLLM behind TLS / a reverse proxy
  • Isolate the admin UI/API from public proxy traffic (separate admin.port, with TLS)
  • Use a strong VOIDLLM_ENCRYPTION_KEY (32+ bytes) and keep it in a secrets manager
  • Don't use VOIDLLM_ADMIN_KEY as a production API key - it's for bootstrap only
  • Set resource limits and network policies in Kubernetes
  • Scrape /metrics with Prometheus
  • Configure database backups
  • For multiple replicas, use Redis so rate limits and budgets are shared (they are per-process without it) - Enterprise

See the Security Hardening guide for the full list.

Privacy

This is not a feature toggle. It's an architectural decision that makes VoidLLM a privacy-first LLM proxy.

  • No request body in logs, DB, or any persistent storage
  • No response body in logs, DB, or any persistent storage
  • No prompt caching - content passes through memory only
  • Usage events contain only: who (key/org/team), what (model), how much (tokens/cost)
  • There is no enable_content_logging option. It doesn't exist.
  • Designed to support GDPR compliance - no personal data in prompts is stored or processed

CLI Tools

# Bidirectional database migration
voidllm migrate --from sqlite:///data/voidllm.db --to postgres://user:pass@host/db
# License management (for Enterprise)
voidllm license verify < license.jwt

Project

License

Business Source License 1.1 - source available, self-hosting permitted, competing hosted services prohibited. Converts to Apache 2.0 four years after each release.


Built by VoidMind · voidllm.ai

This project was built with significant assistance from AI (Claude by Anthropic).

About

Privacy-first LLM proxy and AI gateway - load balancing, multi-provider routing, API key management, usage tracking, rate limiting. Self-hosted. Zero knowledge of your prompts.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

130 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages