Skip to main content

A small, privacy-first text-to-image tool: type a prompt, get an image. Bring your own provider.

Project description

🖼️ Limn

to limn: to depict or describe; to paint.

A small, privacy-first tool that turns a text description into an image. Type a prompt, get a picture — no account, minimal options, bring your own provider.

pip install limn

limn "a red bicycle against a brick wall" -o bike.png
  • Type a description → get an image. That's the whole thing.
  • No account, private by default. Your prompts and images are yours. The only network egress is the generation request to the provider you chose.
  • Bring your own provider — self-hosted (SwarmUI / any OpenAI-compatible endpoint) or a cloud key (Google Imagen, OpenAI / DALL·E). Swap with one setting.
  • Minimal by design. Prompt, size, count, seed. Want power? Install something bigger — Limn stays lean.

Quick start

Pick whichever provider you already have:

# Google Imagen (cheap, ~$0.02/image on the Fast tier)
export GEMINI_API_KEY=...
limn "watercolour fox" --provider gemini

# OpenAI Images
export OPENAI_API_KEY=...
limn "watercolour fox" --provider openai

# Self-hosted SwarmUI
export SWARMUI_BASE_URL=https://image.example.org
limn "watercolour fox" --provider swarmui

# Any OpenAI-compatible /v1/images endpoint (LocalAI, ...)
export OPENAI_BASE_URL=http://localhost:8080/v1
limn "watercolour fox" --provider openai-compatible

Then set your provider once so you never pass --provider again:

limn --init-config        # writes a commented ./limn.yaml template
mv limn.yaml ~/.limn.yaml # personal defaults, used everywhere

Usage

limn "a red bicycle against a brick wall" -o bike.png
limn "watercolour fox" --provider swarmui --size 1024x1024 --count 4 --seed 42
Option What
-p, --provider swarmui, openai-compatible, openai, gemini
-m, --model Model name (provider-specific)
-s, --size e.g. 1024x1024 (Imagen maps to the nearest aspect ratio)
-n, --count Number of images (1–10)
--seed Reproducibility, where the backend supports it (SwarmUI)
--negative Negative prompt, where supported (SwarmUI)
-o, --out Output file; default is a slug of the prompt, never overwritten
-c, --config Explicit config file

Config

Layered, later wins: built-in defaults → ~/.limn.yaml (your provider + keys, set once) → ./limn.yaml → CLI flags. Secrets are referenced as ${VAR} so no plaintext keys live in files:

provider: swarmui
size: [1024, 1024]

providers:            # keep several configured; swap with `provider:`
  swarmui:
    base_url: https://image.example.org
    model: juggernautXL_v9
    api_key: "${SWARMUI_TOKEN}"
  gemini:
    model: imagen-4.0-fast-generate-001

Roadmap

A CLI (this release), then a simple web UI (limn serve: type → generate → view → save / delete / regenerate), then a Tauri desktop app with bring-your-own-provider, plus a rate-limited, non-storing demo.

📄 See SPEC.md for the full specification.

Companion to slide-stream, which shares the same image-provider approach.

Project details


Download files

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

Source Distribution

limn-0.1.0.tar.gz (98.5 kB view details)

Uploaded Source

Built Distribution

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

limn-0.1.0-py3-none-any.whl (15.7 kB view details)

Uploaded Python 3

File details

Details for the file limn-0.1.0.tar.gz.

File metadata

  • Download URL: limn-0.1.0.tar.gz
  • Upload date:
  • Size: 98.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.0

File hashes

Hashes for limn-0.1.0.tar.gz
Algorithm Hash digest
SHA256 8280fc30abe31402a991e7edb2c2c5f0eeacfacb13c159000a079e956a2cbabc
MD5 e55f6542408af7179020c0d8bfef4094
BLAKE2b-256 957f1cf9384fde80f497f5db550f0bd88adcb7f18b2db95f819e73bab9ef8105

See more details on using hashes here.

File details

Details for the file limn-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: limn-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 15.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.0

File hashes

Hashes for limn-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1b5bc6fff0808f4b529089249e2ca50cae0aa474f59ebfc2b146977b4fb12f37
MD5 01f8a1fdac8c738cfa97d15e37ca58f1
BLAKE2b-256 e148c5edd6b95f33c86b5a010d8294b676f86055ee4971d64296cce0f3dffeae

See more details on using hashes here.

Supported by

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