Run inference on your own GPUs
Install a single binary or Docker container. Your prompts and completions stay on your hardware — routed through the same API, the same SDKs, the same console.
qwen3.6:35b
llama3.3:70b
Why self-host
Full data control
Prompts and completions are processed entirely on your hardware. Requests route through the Pendra API, but inference never leaves your environment.
Unified orchestration
Centralised load balancing across your GPU fleet. One API, one console, one set of SDKs.
Hybrid ready
Run managed and self-hosted workers side by side. Route sensitive workloads to on-premises, everything else to Pendra.
Installation
Install with the native package for your OS or run as a Docker container. On a Linux server the quickest path is curl -sSL https://get.pendra.ai/worker | sh, which auto-detects your GPU; you can instead add the Pendra apt or yum repository so apt upgrade / dnf upgrade keeps the worker current. On macOS and Windows, open the Pendra console → Workers → Add worker for an OS-aware download with checksums. Full per-OS instructions live in Workers → Install.
# Linux server — one command, auto-detects your GPU
curl -sSL https://get.pendra.ai/worker | sh
# …or install manually:
# macOS (Apple Silicon) — open the .dmg, drag Pendra into /Applications
open Pendra-<v>-arm64.dmg
# Windows — run the signed installer, no UAC needed
PendraSetup-<v>.exe
# Linux — pick CPU / CUDA / Vulkan to match your GPU
sudo apt install ./pendra_<v>_linux_amd64.deb
sudo pendra setup # writes /var/lib/pendra/config.yaml and restarts pendra.service
Each installer registers the OS service (LaunchAgent on macOS, Run key on Windows, systemd on Linux), so the worker comes back up after a reboot. macOS supports Apple Silicon only — Intel Macs are no longer supported because the in-process Metal path needs Apple Silicon. Linux ships three GPU variants (CPU baseline, CUDA, Vulkan) for both amd64 and arm64.
CLI reference
The pendra CLI manages your worker. Config is stored in
~/.pendra/config.yaml. Full env-var reference at
Workers → Configuration.
| Command | Description |
|---|---|
pendra setup | Interactive setup wizard — enter your key and save config |
pendra models install <model> | Pull a catalogue model onto the worker. Add --wait to block until the worker is serving it, --detach to hand the download to the worker and return straight away, or -o json for one JSON line per progress update (the default whenever output isn't a terminal). Re-running it while the same model is still downloading joins that download instead of starting another. |
pendra models jobs | Show the installs in flight on the worker — whoever started them — with progress, current part, and ETA. --all includes recently finished ones; -o json for scripts. |
pendra models wait <model> | Block until the worker is serving a model (waiting for any in-flight install of it first). Exits non-zero, with a reason, if it never is. |
pendra run | Start the worker and begin serving inference requests |
pendra models | List the models installed on the worker |
pendra status | Show connection status, active models, and whether each kind of inference is running on the GPU (and through which GPU backend) or on the CPU |
pendra restart-backend | Restart just the inference engine without stopping the worker (a fresh process starts on the next request) — recovers a GPU that stalled while the worker was running and has fallen back to CPU. A GPU that failed when the worker started needs a full worker restart instead (the service or the container) |
pendra config | View resolved configuration (env + file + defaults) |
pendra config set KEY VAL | Set a configuration value in ~/.pendra/config.yaml |
pendra logs | Tail the worker's log buffer; -f follows. Use systemctl status pendra / launchctl print to manage the OS-supervised service installed by the .deb / .rpm / .dmg / .exe package. |
pendra version | Show version, Go version, and platform |
Workers in the console
The Pendra console → Workers page lists every worker you've connected and its live status. When a worker disconnects — you stop it, reboot the host, or it loses its network — it stays listed as Offline with the time it was last seen, rather than disappearing, so you can tell a worker went away from one that was never added. A worker that comes back online reappears on its own; you don't need to re-add it.
An offline worker is removed automatically 30 days after it last disconnected. To remove one sooner, open it and choose Delete (or use the delete action beside it on the Workers list) — you can only delete a worker while it's offline. If you revoked the worker key it connected with, the worker can't reconnect, and the console flags it so you know to delete it or issue a new key and reinstall.
Models
A worker serves models from Pendra's curated catalogue — vetted
open-source models (Llama, Qwen, Mistral, gpt-oss, Phi, embeddings, and
more). Install one with a single click in the console (Models →
Install) or with pendra models install <model>;
Pendra downloads a verified GGUF straight onto the worker, no SSH or
shell required. If the worker drops offline mid-download, the install
picks up where it left off when it reconnects — it doesn't restart from
zero, and the console shows the download as interrupted until it resumes.
Connection drops during a large download are retried automatically, and if
an install does fail on a flaky network, installing it again continues
from the bytes already downloaded. Image models, and chat models that
accept images, are often made up of several files; one is listed as
installed and starts taking requests only once every file has downloaded
and been checked.
Installing from a script or an automation tool works the same way.
pendra models install <model> --wait returns only once the
worker is actually serving the model, and its exit code tells you what
happened: 0 installed and serving, 1 failed (the
reason is printed), 2 unknown model, 3 the
download was handed to the worker and is still running (what
--detach returns, and what you get if you press Ctrl-C or the
session drops mid-download). When the output isn't a terminal — a log
file, a pipe, docker exec — progress arrives as one JSON
line per update with the bytes, part, rate and ETA, instead of a redrawn
bar. A download you left running is easy to check on from another shell
with pendra models jobs, and re-running the same install
command joins it rather than starting a second copy; large models that
ship as several files show which part is downloading, in the console as
well as the terminal.
Out of the box a worker handles chat (with reasoning, tool calling, structured outputs, and vision), embeddings, image generation, and audio transcription — all in-process, with nothing else to install. See choosing a model size and choosing a quantization to pick the right variant for your hardware.
Requirements
| Component | Requirement |
|---|---|
| OS | Linux with glibc 2.38+ — Ubuntu 24.04+ / Debian 13+ — (x86_64, arm64), macOS 14 or later (Apple Silicon only), or Windows 10 / Server 2016 or later (amd64). Full matrix: system requirements. |
| GPU | NVIDIA recommended for production; the worker ships CUDA, Metal, and Vulkan builds. The CUDA builds cover RTX 20-series and newer (compute capability 7.5+, which includes the T4 and A / L / H data-centre cards) with driver R580+ — older NVIDIA cards, including the V100 and P100, use the Vulkan build. CPU-only mode supported for testing. |
| Network | Outbound WSS to api.pendra.ai. No inbound ports needed. |
| Docker | Only needed if running the worker as a container. Not required for binary install. |
Hybrid deployments
Route traffic based on sensitivity, cost, or performance. Your application code stays the same regardless of where inference runs.
Self-hosted
Patient record summarisation, classified document analysis, privileged legal review.
Pendra-managed
Internal knowledge bases, customer support drafts, code generation, general-purpose tasks.
Want us to handle it instead?
Let us run your workers
If you'd rather not manage your own GPUs, we can run dedicated workers for you on Pendra-managed infrastructure. Same API, zero operational overhead.