One‑sentence idea ➜ contest‑topping prompt ➜ (optional) generated media — autonomously.
| Platform | Link |
|---|---|
| NightCafe (Art) | https://creator.nightcafe.studio/u/LocalSymmetry |
| Suno (Music) | https://suno.com/@localsymmetry |
| YouTube (Music) | https://youtube.com/channel/UCcoAFyeiMwzSb24iVml9wSA |
| YouTube (AI Demos) | https://youtube.com/@lofnai |
| Spotify | https://open.spotify.com/artist/3egvpGmWFxgYY8XqATui8r |
| Apple Music | https://music.apple.com/us/artist/local-symmetry |
| Boomplay | https://www.boomplay.com/artists/111995625 |
| https://www.instagram.com/local.symmetry | |
| TikTok | https://www.tiktok.com/@lofn.ai |
Full‑resolution PNGs are in
/examples, each namedcommunity‑challenge‑<id>.png.
| Title | Challenge | Placement | Field Size | NightCafe Link |
|---|---|---|---|---|
| Petals Kiss the Tide | Flowers | 🥇 1st | 1 910 | MoEhHHLb |
| Being Devoured by the Role | Female Portraits | 🥇 1st | 673 | lKMuiIeK |
| Can’t Figure the Way Forward | No Theme (Uploads) | 🥇 1st | 869 | a4ww4P3K |
| Enchanted Dark Fairy Perches on Crescent Moon | Crescent Fae | 🥇 1st | 459 | mL9iwog1 |
| Stylish Attire | Stylish Attire | 🥈 Runner‑up | — | BDkppU9l |
| Green | Green | 🥈 2nd | 348 | 1J5idcZk |
| Dangerous Bap Target | Biomechanical Creature | 🥈 2nd | 430 | 6H3ljL30 |
| Constellation of Gilded Dreams | Gilded Dreams | 🥈 2nd | — | ZoeZJBLN |
| Esteemed Opulance | Opulence | 🥈 2nd | — | rW6e9QTP |
| Mosaic Sea | Radiant Sea | 🥉 3rd | 512 | q7X2vFvy |
- 🥇 Whirl Daily Art Competition – first place (“Only This and Nothing More”).
- 🥈 Whirl Discord Art Challenge – second place (“A Victorian Chrononaut”).
Whirl images live in
/examples(Only this...jpeg,2nd_A Victorian Chrononaut...png).
| Cluster | Highlights |
|---|---|
| Reasoning Core | Tree‑of‑Thoughts search + iterative Artist ⇄ Critic loop |
| Steerability | 10 Style Axes, Creativity Spectrum sliders, persistent Personality DNA |
| Expert Panels | Automatic or user‑selected 6 experts + 1 devil’s advocate debate each branch |
| Multi‑Modal | Image, Music, Video |
| TikTok Mode | FLUX Pro v1.1 Ultra 9:16 images rotated for Veo 3 ingestion |
| Competition Mode | Shrinks the prompt to platform limits while preserving nuance; injects Panel + Personality context first |
| Model‑Agnostic | Works with OpenAI, Anthropic, Google Gemini, Meta Llama, and any OpenAI‑compatible local LLM (via Ollama, text‑gen‑webui, etc.) |
| Nano Banana | Gemini 2.5 Flash Image preview for Gemini‑powered image generation |
| Phase‑Map Transparency | A visible flowchart of every stage, emitted with each run |
| Ethics & Provenance | Strong NSFW/harassment filters + anti-copyright infringement checks |
| Discord & Webhooks | Push prompts or rendered assets straight to any channel |
- Quick Start
- Installation • Configuration
- Usage
- Concept → Prompt Pipeline
- Style Axes • Personality
- Panels • Modes
- Model Coverage
- Ethics & Provenance
- FAQ • Contributing • License
# 1 · Clone
git clone https://github.com/LocalSymmetry/lofn.git && cd lofn
# 2 · Create config & add API keys
cp config.yaml.example config.yaml # then edit
# 3 · Docker (up‑to‑date CUDA & ffmpeg baked in)
docker build -t lofn .
docker run -p 8501:8501 \
-v $(pwd)/images:/images \
-v $(pwd)/videos:/videos \
-v $(pwd)/music:/music \
-v $(pwd)/metadata:/metadata \
lofn
# 4 · Open
open http://localhost:8501- Docker 24+ (or native Python 3.11 / Poetry if you prefer)
- GPU with 8 GB+ VRAM recommended for on‑device Stable Diffusion / video renders
- API keys for at least one text model (OpenAI, Claude, Gemini…) or a local LLM endpoint
poetry install --with=dev
export OPENAI_API_KEY=...
streamlit run app.py # identical UI to Docker imageOnly keys & endpoints live in config.yaml:
OPENAI_API_KEY: ""
ANTHROPIC_API_KEY: ""
GOOGLE_API_KEY: "" # Gemini / Imagen 3
OPEN_ROUTER_API_KEY: ""
POE_API_KEY: ""
FAL_API_KEY: "" # Flux 1 / SDXL
RUNWAY_API_KEY: "" # Gen‑3 Alpha
DISCORD_WEBHOOK_URL: ""
LOCAL_LLM_API_BASE: "" # e.g. http://localhost:11434/v1
LOCAL_LLM_API_KEY: ""
GCP_PROJECT_ID: ""
GCP_LOCATION: ""LLM start-up priorities live in lofn/model_defaults.yaml. Each mode
(art, video, music) defines a preferred list for concept/medium
generation and for final prompt synthesis. Lofn will attempt to use the first
available model from each list when a mode is selected, falling back to the
built-in order if none of the preferred models are accessible. These preferred
models also appear at the top of the model selectors when present.
All behavioural constants sit in lofn/constants.py (tree widths, critic weights, etc.).
- Choose Mode (Art, Music, Video)
- Toggle Competition (optional)
- Generate Personality → then Select / Generate Panel
- Enter Idea — one sentence is enough
- Generate → Review concepts → Pick or iterate
- Copy Prompt or let Lofn call the generator API automatically
Raw prompts, images, audio and video are auto‑saved in /images, /music, /videos, with human‑readable JSON metadata for provenance.
flowchart TD
A[User Idea] --> B[Panel & Personality Injection]
B --> C[Meta‑Prompt]
C --> D[Tree‑of‑Thoughts Expansion]
D --> E[Artist Embellishment]
E --> F[Critic Compression]
F --> G[Synthesis & Ranking]
G --> H[Ethics / Provenance Filter]
H --> I[Competition Shrink]
I --> J[Final Prompt]
J --> K[Optional Render]
Each node including intermediate drafts is stored in /metadata with RFC‑3339 timestamps for auditability.
| # | Axis | 0 | 100 |
|---|---|---|---|
| 1 | Abstraction → Realism | Cubist blur | 4 K photoreal |
| 2 | Desaturation → Vibrancy | Monochrome | Neon pop |
| 3 | Minimal → Complex | Single subject | Hyper‑ornate |
| 4 | Calm → Dramatic | Soft focus | High contrast |
| 5 | Symmetry → Asymmetry | Mirror‑perfect | Chaotic skew |
| 6 | Familiarity → Novelty | Classical | Surreal |
| 7 | Soft → Hard Lines | Watercolor | Etching |
| 8 | Warm → Cool Palette | Sunset hues | Arctic blues |
| 9 | Static → Motion | Still life | Dynamic action |
| 10 | Low → High Symbolism | Literal | Metaphoric overload |
Change them in the sidebar or let Lofn auto‑infer from your concept.
A thematic setting that provides a consistent creator persona that lasts between generations.
Leave empty for LLM‑generated defaults or curate for brand consistency.
Custom personas can also be loaded from lofn/prompts/custom_personalities.yaml.
Copy the provided custom_personalities.yaml.example file to this location and
add your own entries to have them appear in the sidebar.
Groups of 5 experts + 1 devil’s advocate simulate a live debate on every branch.
| Type | Description |
|---|---|
| Preset | Photography, Baroque, Cyberpunk Music, Screenwriting, … |
| LLM‑Generated | Lofn fabricates domain experts on the fly |
| Custom | Hand‑define names, bios & biases in panels.yaml |
Any OpenAI‑compatible local LLM (Ollama, llama.cpp) works by setting LOCAL_LLM_API_BASE.
- OpenAI policy & Google Imagen safety filters enforced by default
- Custom block‑lists for hateful or harassing content
- Prompt hardening against copyright infringement
- All prompts and generations logged locally for transparency
Expand
Q: Can I feed sketches or images as input? Yes. Upload up to five reference images to guide the generation.
Q: Why use Lofn over other prompt generators? Lofn was made to have the highest possible quality to win.
Q: How do I swap in a new model?
Edit config.yaml (API key) and add a mapping in lofn/llm_integration.py. The prompt templates are model‑agnostic.
- Open an Issue — bug, feature, or prompt tweak
- Fork → Branch (
feat/xyz) - Code & Test (pytest,
examples/cli_smoke_test.sh) - PR — use Conventional Commits, fill template
- 🎉 Celebrate — we squash‑merge weekly
Apache 2.0 — free for personal & commercial use, attribution appreciated.