rxxusp.net / blog
← all posts
postJun 20, 2026·4 min read

local-engine-router v0.5.0: pip install, a curl bootstrap, and a setup wizard

The version where getting it running stopped being a chore. It is on PyPI, there is a one-line installer, and `routerctl init` probes your machine and writes the config for you.

When I shipped local-engine-router the swap logic was solid but the on-ramp was not. You cloned the repo, ran pip install ., and then sat in front of an empty file writing YAML by hand before anything would start. That is a lot of friction for a tool whose whole point is to make a local-inference box less fiddly. v0.5.0 is the release that fixes the first five minutes.

It is on PyPI

The package is published as local-engine-router, so the shortest path in is one line and no git clone.

pip install local-engine-router

That leaves the local-engine-router and routerctl commands on your PATH. It needs Python 3.10 or newer and no GPU, since the router itself is just a proxy that tells the engines what to do. pipx works too if you would rather keep it isolated, which for a command-line tool is the better default.

The curl bootstrap

If you want the full setup rather than just the package, there is a one-line installer.

curl -fsSL https://raw.githubusercontent.com/rxxusp/local-engine-router/main/install.sh | bash

install.sh creates an isolated virtualenv so it never pollutes system packages, installs the package into it, links the two commands into ~/.local/bin, writes a starter config if you do not already have one, and offers to install and enable the systemd --user service on Linux. It is idempotent, so re-running it is also how you upgrade. You can drive it non-interactively by passing flags through the pipe, bash -s -- --yes to accept defaults and enable the service, or --no-service to skip systemd entirely. Everything is overridable by environment variable, and it ships --dry-run, --print-unit, and --uninstall so you can see exactly what it will touch before it touches it.

routerctl init, the part I am happiest about

The config used to be the wall. So v0.5.0 adds a setup wizard.

routerctl init

It probes the well-known localhost ports of the supported backends, confirms which ones are actually listening, and where it can it fetches each engine's live model list directly. Then it asks only the handful of things it genuinely cannot infer: the bind host, an optional API key, and which of the detected engines you want to include. From those answers it scaffolds a working config.yaml out of the matching backend presets. The result is the answer-a-few-prompts-and-have-a-running-router path I wanted from the start, instead of staring at an empty YAML file guessing at lifecycle types.

And Docker, for completeness

There is a docker-compose.yml in the repo now, so docker compose up -d brings the router up against a mounted config. Same proxy, same swap behavior, just containerized.

None of this changes the core. It is still the single OpenAI- and Ollama-compatible endpoint that swaps the GPU to whichever engine owns the requested model and waits for memory to actually settle before loading the next one. v0.5.0 just means you can get to that point in one command instead of ten. The source is on GitHub at github.com/rxxusp/local-engine-router, and pip install local-engine-router is the whole story if you only read this far.

## comments (0)

No comments yet — be the first.

## leave a comment

Comments are moderated before they appear. Plain text — blank lines start a new paragraph.