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
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:
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:
- Start with the requested profile
- Reduce prompt batch size
- Reduce context length
- Select a lower-memory KV-cache type
- Reduce maximum output tokens
- 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.