Skip to main content

lllm3090

Local LLM serving for a single consumer GPU, with a browser control panel.

A llama.cpp engine, a web UI on loopback that starts and stops it and downloads models, and a curated model list where every entry has been checked to fit 24 GB with a usable context left over — recomputed for whatever card it finds.

Install

Debian 13 or a derivative (Ubuntu 24.04 / 26.04), an NVIDIA GPU — the catalogue is curated for 24 GB and computed for whatever you have — and the driver already working:

# uv, if you do not have it: https://docs.astral.sh/uv/getting-started/installation/
curl -LsSf https://astral.sh/uv/install.sh | sh

uv tool install lllm3090
lllm3090 setup

setup checks the hardware, installs the one apt package the engine needs, fetches a pinned llama.cpp build and starts the panel as a user service. It is safe to re-run and skips whatever is already done.

It touches nothing outside $HOME except libvulkan1, and downloads no model weights — you pick those from the panel.

Then open http://127.0.0.1:8080, download Qwen3-8B (5 GB) to prove the install works, and Qwen3.6-35B-A3B (17.7 GB) for real use — at 126 tok/s it is the fastest model that also reaches a full 262k context, which is what agentic work needs. gpt-oss-20b decodes faster still, at 160, in half the room.

Use

lllm3090 models          # what exists, what fits, what is downloaded
lllm3090 start Qwen3.6-35B-A3B
lllm3090 status
lllm3090 claude          # launch Claude Code against the local model
lllm3090 tui             # the panel, drawn in the terminal
lllm3090 stop            # free the VRAM

The engine exposes both the OpenAI API (/v1/chat/completions) and Anthropic's (/v1/messages) on 127.0.0.1:1919, so Claude Code and OpenAI-compatible clients both work against it without a translation proxy.

What travels to another card, and what does not

The catalogue makes two kinds of claim, and they do not travel together.

Whether a model fits, and what context it leaves, is arithmetic over capacity. The GPU is detected and the figures are computed for that card, so they are right on a 4090, on a 32 GB 5090, on a 96 GB PRO 6000, and on a 16 GB 5080 where most of the catalogue does not fit at all. An unrecognised card gets a profile synthesised from what nvidia-smi reports rather than falling back to 3090 assumptions.

How fast it runs is a measurement, true of the card it was taken on and nowhere else. Every tokens-per-second figure here was measured on an RTX 3090. Elsewhere they are labelled (other card) and are never scaled by a bandwidth ratio — that produces a guess which prints like a measurement.

So the name is the card it was built and measured on, not a limit on where it runs. lllm3090 bench is how another card gets real numbers of its own; see other cards.

Documentation

https://gilesknap.github.io/lllm3090

If you are weighing this against Ollama, LM Studio or llama-swap, that comparison is written down: what else is out there, and what this does that they do not — including when you should use one of them instead.

Contributing

Pull requests are welcome, including small ones — a model that works, a speed measured on a card nobody here owns. CONTRIBUTING.md has the setup, the three commands CI runs, and how to add a catalogue entry. No GPU is needed to work on this; the test suite runs without one.

The panel

The lllm3090 control panel

Engine state and VRAM on one line at the top, then one list of every model — what is on this disk and what is merely available — with what fits this card and what it will do, and the engine log streaming underneath. Each row carries the only control that makes sense for it: Start, Stop, Get, Cancel, or a too big pill. Click a row to read what the model is for. Downloads run in the background with progress, and resume from a part file if interrupted.

On a machine with no browser within reach of it — a text console, an SSH session without a tunnel — lllm3090 tui draws the same panel in the terminal.

Download files

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

Source Distribution

lllm3090-0.5.0.tar.gz (454.2 kB view details)

Uploaded Source

Built Distribution

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

lllm3090-0.5.0-py3-none-any.whl (68.4 kB view details)

Uploaded Python 3

File details

Details for the file lllm3090-0.5.0.tar.gz.

File metadata

  • Download URL: lllm3090-0.5.0.tar.gz
  • Upload date:
  • Size: 454.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for lllm3090-0.5.0.tar.gz
Algorithm Hash digest
SHA256 ed500b4b1dc7bcd9aca877d5bf67e6f0fdc56c4d6bbeed81aaa5b60d8ec6172c
MD5 e507c2f9a8591c86267c4a21b1e8aad1
BLAKE2b-256 33666cdcb68401746f61e1bd6c359512b4b9688d9e18b1884b13f0102a326786

See more details on using hashes here.

File details

Details for the file lllm3090-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: lllm3090-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 68.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for lllm3090-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 20e3601d5696efedfc768ec11fecbeb16a0fa3a54695bf00cdfd17ccec0e4b44
MD5 e58b8239d19c5ebc9f081e9372bc2646
BLAKE2b-256 54a3221ea7b5a59380e7e6896a7b2633669a363b2f77080b734bf4365c41f321

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.5.0 This release

2 files

0.4.0

2 files

0.3.0

2 files

0.2.0

2 files

0.1.0

2 files

Supported by

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