█ ▄ ▄ ▄▄▄▄▄ ▄▄
█ █ █ █ █ █ █▄▄█
█▄ ▀▄▄▀ █ █ █ ▀▄▄▄
A small, beautiful terminal chat client for Claude, GPT and Gemini.
lume — rhymes with room. Not "loo-may", not "lum". It's the old word for light.
Replies stream in as rendered Markdown — syntax-highlighted code, aligned tables, nested lists — under a calm animated status line. Conversations live on your own disk, in plain JSONL you can read, grep and delete. Five themes. One binary-free install.
Zero dependencies. Pure standard library: nothing to resolve, nothing to audit, nothing to break on upgrade day. Python 3.10 or newer.
█ ▄ ▄ ▄▄▄▄▄ ▄▄
█ █ █ █ █ █ █▄▄█
█▄ ▀▄▄▀ █ █ █ ▀▄▄▄
Opus 5
/help for commands · Ctrl-C to stop a reply · Ctrl-D to leave
❯ explain a bloom filter in two sentences
lume
A Bloom filter is a compact bit array plus k hash functions: to add an item you
set the k bits it hashes to, and to test one you check those same bits.
It answers "definitely not present" or "probably present" — false positives are
possible, false negatives are not.
─ opus-5 · 1.4s · 412 in / 96 out · $0.004
❯
Install
pip install lume-ai # provides the `lume` command
Or run it straight from a checkout — there is nothing to build:
git clone https://github.com/bobby-tablez/lume-ai && cd lume-ai
./lume-cli # or: python3 -m lume
Providers
lume speaks to three vendors through one interface. Set the key for whichever you
want; anything you have a key for shows up in /models.
| Provider | Environment variable | Aliases | Models |
|---|---|---|---|
| Anthropic | ANTHROPIC_API_KEY |
opus sonnet haiku fable |
Opus 5, Opus 4.x, Sonnet 5, Sonnet 4.6, Haiku 4.5, Fable 5 |
| OpenAI | OPENAI_API_KEY |
gpt mini nano |
GPT‑5.1, GPT‑5, GPT‑5 mini/nano, GPT‑4.1, GPT‑4o mini |
GEMINI_API_KEY |
gemini flash lite |
Gemini 3.1 Pro, 3.7 Flash, 2.5 Pro/Flash/Flash‑Lite |
/models shows the live table with context windows and per‑million prices, and
greys out any provider you have not set a key for.
export ANTHROPIC_API_KEY=...
lume # starts a session on the default model
lume --model sonnet # or pick one
Switch mid-conversation with /model gpt-5.1, and pin the vendor when an alias is
claimed by two of them: /model google:mini. Aliases resolve in provider order —
Anthropic, then OpenAI, then Google. Any OpenAI-compatible endpoint — Groq, xAI,
DeepSeek, Together, OpenRouter, Ollama, LM Studio — works by pointing
OPENAI_BASE_URL at it.
Keys are read from the environment, used, and never written anywhere: not to the config file, not to a log, not into an error message, and never into a URL.
Use
lume # interactive
lume "explain this regex: ^\d{3}-\d{4}$" # one-shot, then exit
git diff | lume "review this" # stdin is folded into the message
lume --resume last # pick up where you left off
lume --model haiku --no-thinking # cheap and fast
lume --list # what have I got saved?
Commands
Session
| Command | |
|---|---|
/new [title] |
Start a fresh conversation, optionally with a title. |
/resume, /r [ref] |
Reopen a session by id, list number, or "last". |
/list, /ls [query] |
List saved sessions, newest first; filter with a query. |
/rename [ref] <title> |
Give a session a better title. |
/delete, /rm <ref> |
Delete a session and its transcript for good. |
/export [format] [path] |
Write the transcript out as markdown, json, or text. |
Conversation
| Command | |
|---|---|
/system [text] |
Show, set, or clear the system prompt. |
/retry [note] |
Send the last message again, optionally with a nudge. |
/undo [n] |
Drop the last exchange, or the last n, from the chat. |
/edit [n] |
Reopen an earlier message in $EDITOR and send it again. |
/copy, /y [n] |
Copy the last reply, or message n, to the clipboard. |
/clear, /cls [history] |
Clear the screen; add history to also forget the conversation. |
/usage, /tokens, /cost |
Show the tokens this session has used and what they cost. |
Model
| Command | |
|---|---|
/model, /m [name] |
Show the current model, or switch to another. |
/models |
List every model with its context window and price. |
/think [on|off] |
Turn extended thinking on or off. |
/effort [level] |
How hard to think: low, medium, high, xhigh, or max. |
Interface
| Command | |
|---|---|
/theme [name] |
Show the current colour theme, or switch to another. |
/keys |
Show the key bindings and the multi-line input rules. |
/help, /h, /? [topic] |
Show this help, or the detail for one command. |
/quit, /exit, /q |
Leave lume. |
Anything that is not a command is sent to the model. To send a line that really
does start with a slash, double it: //not a command.
Typing
Enter |
Send the message. |
\ at end of line |
Continue on the next line; the backslash is dropped. |
""" |
Open a block. A line ending in """ closes it and sends. |
Alt+Enter |
Add a newline without sending. (needs GNU readline — not Windows, not libedit builds; \ and """ work everywhere) |
| paste | A multi-line paste arrives whole, as one message — never one per line. |
Tab |
Complete a command or its argument. |
↑ ↓ |
Walk back and forth through history. |
Ctrl-C |
Throw the line away — or stop a reply that is already running. |
Ctrl-D |
Exit. (Ctrl-Z Enter on Windows) |
Configuration
~/.config/lume/config.json, written by /model, /theme and friends, or edited
by hand. Every field also has an environment override:
| Variable | |
|---|---|
LUME_MODEL |
Default model. |
LUME_THEME |
aurora, solar, ember, mono, plain, auto. |
LUME_EFFORT |
low, medium, high, xhigh, max. |
LUME_SYSTEM |
Default system prompt. |
LUME_MAX_TOKENS |
Reply cap. |
LUME_HOME |
Where sessions and history live. |
LUME_NO_MOTION |
Turn animation off. |
NO_COLOR |
Turn colour off (respected everywhere). |
Privacy
Conversations never leave your machine except as a request to the model provider
you chose. Sessions are append-only JSONL under $LUME_HOME (or
~/.local/share/lume), directories 0700, files 0600. The prompt's history file
is capped, 0600, and refuses to record any line that looks like a credential —
paste a key at the prompt by accident and it is not written to disk.
Development
python3 -m unittest discover -s tests -v # 1,400+ tests, no network, no fixtures
Every module is independently testable and each provider client takes an injected
transport, so the suite never opens a socket and never needs an API key.
SPEC.md is the interface contract the modules were built against.
Adding a provider is three things: a ModelSpec per model, a client exposing
stream() and close() that yields lume.api.StreamEvent, and a line in
lume/providers/__init__.py.
The name
lume — one syllable, rhymes with room. From lumen: light. It's what a terminal does when it's doing this well.
License
MIT © 2026 bobby-tablez
Metadata
Release files for lume-ai 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| lume_ai-0.1.1.tar.gz | 352.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| lume_ai-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 538.4 kB
Release files / lume_ai-0.1.1.tar.gz
| Download URL | lume_ai-0.1.1.tar.gz |
|---|---|
| Size | 352.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3786a05b6947bf5aa6ac0c777299f91ece9dba20c8131becf0ecf377125b3f1c
|
|
BLAKE2b-256 checksum How to use checksums |
c5263edc046a50f3862b078b94d271ecb3fa1f4a4ccc031c8f33f3c92e7b096d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 19, 2026.
Transparency logRelease files / lume_ai-0.1.1-py3-none-any.whl
| Download URL | lume_ai-0.1.1-py3-none-any.whl |
|---|---|
| Size | 185.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f2567f7cea52aee80a67e9774e28f5b0b0e3ba6d4254e5ee668f14f8a70757f9
|
|
BLAKE2b-256 checksum How to use checksums |
2c2dfa0188bfa160432aac7e25eca63fbcb684463f54e0dba119b1f733deec72
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 19, 2026.
Transparency log