LePika
One command → local AI chat in your browser.
(luh-PEE-ka)
Your gaming GPU is already an AI machine. LePika self-hosts LLMs on the hardware you already own — Mac (Metal), Linux and Windows (NVIDIA) — with zero configuration. No Docker, no API keys, no monthly bill, and nothing you type ever leaves the box.
Named after Pika, the cat who supervises this project. Like any cat, Pika has everything worth having at home and no use for the cloud. Same idea, for your AI.
Install
Mac / Linux
curl -fsSL https://raw.githubusercontent.com/MikaelSabuhi/lepika/main/install.sh | sh
Windows (PowerShell)
irm https://raw.githubusercontent.com/MikaelSabuhi/lepika/main/install.ps1 | iex
Already have uv?
uv tool install lepika
Then run lepika. It detects your OS, GPU, and RAM, offers the models that actually
fit your machine, installs Ollama +
OpenWebUI, pulls your pick, and opens the chat UI at
http://localhost:3000.
LePika installs into
~/.local/bin— if a new terminal can't find thelepikacommand, add that directory to yourPATHor restart your shell.
Prefer to read the source first, or hack on it?
git clone https://github.com/MikaelSabuhi/lepika && cd lepika && uv run lepika —
git and uv are the only
prerequisites; uv fetches its own Python.
What it does
- Native GPU, no containers — Apple Metal on macOS, CUDA on Linux/Windows.
Ollama arrives via Homebrew, the official install script, or winget; OpenWebUI via
uv tool. CPU-only machines work too (LePika warns you they'll be slow). - Models that fit — a curated list filtered to your RAM, so there's no guessing whether a 27B fits in 16 GB.
- Any model, one field — Ollama tags, Hugging Face GGUF builds, or full-weight safetensors repos. Model guide →
- Private by default — Express listens on
127.0.0.1, full stop. Sharing the stack with your network is a Server-mode feature (lepika expose). - Two modes — ⚡ Express (default): everything native, no Docker.
🐳 Server: the same thing as one readable
docker composestack, for the box under the desk. Server guide →
LePika reuses an Ollama you already have instead of installing a second copy.
Everyday commands
| Command | What it does |
|---|---|
lepika |
The setup wizard: detect → pick a model → install → chat |
lepika up / lepika down |
Start / stop the local AI stack |
lepika status |
Mode, engine, UI, and default model at a glance |
lepika doctor |
Diagnose the setup; every ✗ has a one-line fix |
lepika logs |
Tail LePika's logs (--lines, default 50) |
lepika update |
Upgrade the engine and OpenWebUI — chats kept |
lepika model add [ref] |
Download a model and make it the default (no ref → browse) |
lepika model import <dir> |
Import safetensors weights already on disk (--quant picks the format) |
lepika model list / lepika model rm |
List / remove downloaded models |
lepika expose |
Share engine + UI on your network behind a generated key (Server mode) |
lepika connect <url> |
Use an engine on another machine (--local to go back) |
Global flags: --version, --mode express|server (the wizard's, not a per-command
switch), --dry-run, and --help on every command.
All state lives in one place: ~/.lepika — config, logs, and (in Express mode)
OpenWebUI's own chats and uploads. That is what makes lepika update keep your chats.
Point LEPIKA_HOME somewhere else if you prefer.
Why not just use Ollama directly?
You absolutely can. LePika drives Ollama and OpenWebUI; it doesn't replace them. What it saves you:
| By hand | With LePika | |
|---|---|---|
| First run | Install Ollama, install Python, install open-webui, set OLLAMA_BASE_URL, start both, find the port |
One command |
| Choosing a model | Guess, download 20 GB, find out it swaps | A list filtered to the RAM you actually have |
| Wiring UI ↔ engine | Environment variables, by hand, per shell | Done for you |
| Something's broken | Two sets of logs, two projects' issue trackers | lepika doctor, one fix hint per failure |
| Staying current | Update each piece separately, per platform | lepika update |
If you'd rather run the raw tools, their docs are excellent and LePika gets out of your
way. Curious what it's doing on your behalf? It's a few files of plain Python in
src/lepika/: three dependencies, no magic.
Requirements
- Disk for the models: ~0.5 GB for a tiny one, ~5 GB for a good all-rounder, 40 GB+ for the flagships.
- 8 GB RAM recommended. Less works: LePika steers you to smaller models.
- A GPU is optional. CPU-only machines run everything, slowly, and LePika says so up front.
- macOS: Homebrew (without it, LePika points you at the Ollama.app download). Windows: winget, which ships with Windows 10/11. Full-weight imports have their own fine print — see the model guide.
Documentation
- Model guide — every model-ref shape, full-weight imports, gated repos
- Server mode — the compose stack, using a GPU box remotely, security
- Architecture — design rules and how it's built
- Changelog — what changed in each release
Contributing
Issues and pull requests are welcome — including an issue for what you'd want next. CONTRIBUTING.md has the short version of how a change gets in. Found a security problem? SECURITY.md says how to report it privately.
uv sync --dev && uv run pre-commit install && uv run pytest -q
License
MIT © Mikael Sabuhi
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file lepika-0.1.2.tar.gz.
File metadata
- Download URL: lepika-0.1.2.tar.gz
- Upload date:
- Size: 1.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2980f8a8018610e929e4be6644bdb4c55a490e7a7e8ed5f99e7d8a01c38fcec4
|
|
| MD5 |
e49ac79c0226ca7ffa68c3e74444f0f2
|
|
| BLAKE2b-256 |
3e0da7ad500b48ba6f6576809f9693488acc571a268e46bd0e792fda6a0453b7
|
Provenance
The following attestation bundles were made for lepika-0.1.2.tar.gz:
Publisher:
release.yml on MikaelSabuhi/lepika
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lepika-0.1.2.tar.gz -
Subject digest:
2980f8a8018610e929e4be6644bdb4c55a490e7a7e8ed5f99e7d8a01c38fcec4 - Sigstore transparency entry: 2667044385
- Sigstore integration time:
-
Permalink:
MikaelSabuhi/lepika@f9142046c6d827fda3f5032e26fd26b498636ea9 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/MikaelSabuhi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f9142046c6d827fda3f5032e26fd26b498636ea9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file lepika-0.1.2-py3-none-any.whl.
File metadata
- Download URL: lepika-0.1.2-py3-none-any.whl
- Upload date:
- Size: 70.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f2ac3b8646ad085c8fb6352d8fe3777629c97bd0e6f789037a478608e7a10a73
|
|
| MD5 |
e51e02a7205282156383f82a6e9de9bb
|
|
| BLAKE2b-256 |
e176dbbac84eaa55665e7c91065dbb8b9af2bfae6a504478be3b476c025372bc
|
Provenance
The following attestation bundles were made for lepika-0.1.2-py3-none-any.whl:
Publisher:
release.yml on MikaelSabuhi/lepika
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lepika-0.1.2-py3-none-any.whl -
Subject digest:
f2ac3b8646ad085c8fb6352d8fe3777629c97bd0e6f789037a478608e7a10a73 - Sigstore transparency entry: 2667044438
- Sigstore integration time:
-
Permalink:
MikaelSabuhi/lepika@f9142046c6d827fda3f5032e26fd26b498636ea9 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/MikaelSabuhi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f9142046c6d827fda3f5032e26fd26b498636ea9 -
Trigger Event:
push
-
Statement type: