OnPremo

Run models on your machine. No matter the size.

OnPremo inspects your machine — a workstation, a laptop, a Raspberry Pi, even a 500 MB board — and tells you which open models it can actually run, from tiny to near-frontier. Then it fits the model to the machine before it loads: admission checks, a defined downgrade order, reason-coded rejections. A small Rust control plane around llama.cpp. Offline. Private.

  • Admission before load
  • Defined downgrade order
  • Reject with reason codes
  • No cloud required

Install

One-liner installers download a prebuilt binary, verify SHA-256, and put onpremo on your PATH.

Linux x86_64

Desktop / server / CI hosts

curl -fsSL https://onpremo.org/install-linux-x86_64.sh | sh

Linux ARM64

Pi 3 / 4 / 5 (64-bit OS)

curl -fsSL https://onpremo.org/install-linux-arm64.sh | sh

Linux ARMv7

32-bit Pi OS

curl -fsSL https://onpremo.org/install-linux-armv7.sh | sh

macOS Apple Silicon

Development host (arm64)

curl -fsSL https://onpremo.org/install-macos-apple-silicon.sh | sh

macOS Intel

Development host (x86_64)

curl -fsSL https://onpremo.org/install-macos-intel.sh | sh

Windows (PowerShell)

Install under %USERPROFILE%\.onpremo\bin

powershell -c "irm https://onpremo.org/install-windows.ps1 | iex"

Build from source

Requires Rust, cmake, and a C++ toolchain for the llama.cpp backend.

curl -fsSL https://onpremo.org/install-from-source.sh | sh
Installers verify SHA-256 of published assets. All six targets ship llama-backed binaries — see bin/FLAVORS for the exact asset list. Checksums live in SHA256SUMS. To uninstall: curl -fsSL https://onpremo.org/uninstall.sh | sh

The memory contract

Most local LLM tools let you pick a model and hope it fits. OnPremo treats memory as a control plane: estimate first, load only if the estimate passes, and never treat the OS OOM killer as normal control flow.

Required memory is estimated as:

Required memory =
  model residency
+ KV cache
+ compute buffers
+ tokenizer / runtime overhead
+ operating-system reserve
+ safety margin

The process budget (weights + KV + compute + overhead + margin) is what admission enforces. The OS reserve is reported for device-level capacity but sits outside that process ceiling.

Illustrative onpremo check output

Shape copied from the examples walk-through — numbers depend on host, profile, and model.

decision          admitted
context           512
batch             16
kv cache          F16
max output tokens 128
threads           4
weights           107374182 (102.4 MiB)
kv cache          ...
compute           ...
runtime overhead  ...
os reserve        ...
safety margin     ...
process total     ...  (budget 629145600 (600.0 MiB))
device total      ...

Downgrade order

When the profile default does not fit, admission applies downgrades in this fixed order:

  1. Start with the requested profile
  2. Reduce prompt batch size
  3. Reduce context length
  4. Select a lower-memory KV-cache type
  5. Reduce maximum output tokens
  6. Reject the model as incompatible if it still cannot fit

Rejected with a reason code beats an OOM kill. When nothing in the profile’s configuration space fits, OnPremo refuses the run with a machine-readable reason code instead of swapping the system to death or relying on the kernel OOM killer.

Models

One contract, every rung of the ladder. The table below is the same admission math applied from a 500 MB board to a 122B-parameter open-weight model: fit, downgrade in a defined order, or reject with a reason code. Certified where it is hardest (the Pi tier), useful all the way up — onpremo recommend computes exactly this for your machine.

Verdicts computed by onpremo recommend against real profiles: micro-500mb, pi-1gb-safe, and a 16 GB laptop's profile suggest output. Admission math, pending on-device certification for the tiny tier; weights are fetched only by an explicit onpremo pull — sources and licenses are recorded in the catalogue.

Model Weights 500 MB board 1 GB Pi 16 GB laptop
SmolLM2-135M-Instruct Q4_K_M ~101 MiB fits fits fits
Qwen2.5-0.5B-Instruct Q4_K_M ~469 MiB rejected downgrades fits
Llama-3.2-1B-Instruct Q4_K_M ~770 MiB rejected rejected fits
SmolLM3-3B Q4_K_M ~1.8 GiB rejected rejected fits
gpt-oss-20b MXFP4 ~11.3 GiB rejected rejected fits
Qwen3.6-35B-A3B Q4_K_M ~20.6 GiB rejected rejected rejected
Qwen3.5-122B-A10B Q4_K_XL ~71.7 GiB rejected rejected rejected

Every entry's source, license, and (where pinned) SHA-256 lives in models/catalogue/. Bring-your-own GGUFs get the same verdicts — see Quickstart below.

Quickstart

Three ways to a first model — all end at the same admission contract, and OnPremo never downloads weights unless you ask.

Not sure what fits?

Ask the machine. recommend probes live memory and ranks catalogue and local models, printing ready-to-run commands with the right profile for this host.

onpremo recommend

Use the catalogue

Curated GGUFs with sources, licenses, and SHA-256 pins recorded. pull verifies what it fetches and refuses unpinned entries unless you opt in.

onpremo pull --list
onpremo pull SmolLM2-135M

Bring your own model

Any GGUF works — your fine-tune included. Fetch by URL (the SHA-256 is printed; pin it with --sha256 for repeatable installs) or point the CLI at any path. Admission applies to your model exactly as to a catalogue entry.

onpremo pull --url https://…/model.gguf
onpremo run /path/to/model.gguf \
  --profile pi-1gb-safe --prompt "hi"

Then the same moves work for every model, wherever it came from:

# 1. See what this machine can actually run
onpremo recommend

# 2. Inspect metadata without loading weights
onpremo inspect smollm2-135m-instruct-q4_k_m.gguf

# 3. Test compatibility with a device profile
onpremo check smollm2-135m-instruct-q4_k_m.gguf --profile pi-1gb-safe

# 4. Run one-shot streaming generation
onpremo run smollm2-135m-instruct-q4_k_m.gguf \
  --profile pi-1gb-safe \
  --prompt "Return the intent as JSON" \
  --max-tokens 32

Exit codes for check / run: 0 admitted or downgraded, 2 rejected, 1 for bad paths or invalid profiles. On machines beyond the built-in tiny profiles, onpremo profile suggest derives a profile scaled to the host, and onpremo discover inventories local hardware. Full flag reference lives on the docs page.

Status

0.1.0. Published installer binaries are llama-backed for all six targets (see bin/FLAVORS). The mock backend remains the default for development and CI; the shipped path is the real llama.cpp backend.

On-device Raspberry Pi certification is still pending — treat published numbers as illustrative until certified benchmark reports land. The model catalogue has 4 of 26 SHA-256-pinned entries; unpinned catalogue pulls need --allow-unverified.

Read the docs for CLI flags, profiles, the memory model summary, HTTP API, and build-from-source notes.