CLI tool for batch rendering AI image prompts from markdown files
Project description
Batch Renderer
A CLI tool for batch rendering AI image prompts from markdown files using the Poe API.
Features
- 📝 Extract prompts from markdown files using configurable patterns
- 🎨 Batch render images using multiple AI models (GPT-Image-1, Nano-Banana, etc.)
- 📦 Nested output structure organized by sections
- 🎯 Per-prompt metadata to override model, quality, aspect ratio, etc.
- 🔄 Automatic retries on errors
- 📊 Rich CLI interface with progress bars and colored output
- ✅ Dry-run mode to preview extraction before rendering
- ⚙️ Flexible configuration via CLI, environment variables, or inline metadata
Installation
# Clone the repository
cd batch-renderer
# Install dependencies
pipenv install
# Install the package in editable mode
pipenv install -e .
Quick Start
-
Set up your Poe API key:
echo "POE_API_KEY=your_api_key_here" >> .env
-
Create a markdown file with prompts (see Format below)
-
Dry run to preview:
pipenv run batch-renderer docs/SAMPLE-CONCEPTS.md --dry-run
-
Render images:
pipenv run batch-renderer docs/SAMPLE-CONCEPTS.md
Markdown Format
Basic Format
## 1. Section Title
### Concept 1.1: Image Title
A detailed description of the image you want to generate...
### Concept 1.2: Another Image
Another prompt description...
With Metadata
Add metadata as bullet points after the heading to override settings:
### Concept 1.1: Custom Image
- model: GPT-Image-1
- aspect: 16:9
- quality: high
- retries: 5
A detailed prompt for the image...
Standard Metadata Keys
model- Override the model for this prompt (e.g.,GPT-Image-1,Nano-Banana)format- Override output format (e.g.,png,jpg)skip- Set totrueto skip this promptretries- Number of retry attempts (default: 3)
Custom Metadata Keys
Any other keys are passed directly to the API via extra_body:
aspect- Aspect ratio (1:1,3:2,2:3,16:9,auto)quality- Image quality (low,medium,high)thinking_level- For thinking models (low,medium,high)thinking_budget- Thinking budget (extended)web_search- Enable web search (true/false)
CLI Usage
batch-renderer [OPTIONS] INPUT_FILE
Options
| Option | Description | Default |
|---|---|---|
--model, -m |
Model to use | Nano-Banana (or POE_DEFAULT_MODEL env) |
--output, -o |
Output directory | out |
--pattern, -p |
Extraction pattern (concept, numbered, simple) |
concept |
--format, -f |
Output image format | png |
--flatten |
Flatten output (no subdirectories) | false |
--dry-run |
Extract and display without rendering | false |
--no-confirm |
Skip confirmation prompt | false |
--cache-images |
Cache images in logs/image_cache |
false |
--validation-mode |
Metadata validation (strict, lenient, hybrid) |
hybrid |
--api-key |
Poe API key (or POE_API_KEY env) |
- |
Examples
Basic usage:
batch-renderer prompts.md
Use a specific model:
batch-renderer prompts.md --model GPT-Image-1
Flat output structure:
batch-renderer prompts.md --flatten
Dry run to preview:
batch-renderer prompts.md --dry-run
Batch render without confirmation:
batch-renderer prompts.md --no-confirm
Strict metadata validation:
batch-renderer prompts.md --validation-mode strict
Output Structure
Nested (default)
out/
1-artificial-lovers/
concept-1-1-blade-runner-noir-romance.png
concept-1-2-holographic-love.png
2-fantastic-eight/
concept-2-1-renaissance-group-portrait.png
Flattened (with --flatten)
out/
concept-1-1-blade-runner-noir-romance.png
concept-1-2-holographic-love.png
concept-2-1-renaissance-group-portrait.png
Configuration Precedence
Settings are applied in this order (later overrides earlier):
- Hard-coded defaults (
Nano-Banana,png, etc.) - Environment variables (
POE_DEFAULT_MODEL,POE_API_KEY) - Inline metadata (in markdown file)
- CLI arguments (
--model,--format, etc.)
Validation Modes
hybrid (default)
- Standard keys (model, format, skip, retries): Warns on malformed values
- Custom keys: Pass through without validation
strict
- Standard keys: Fails on malformed values
- Custom keys: Pass through without validation
lenient
- All keys: Warns only, never fails
Error Handling
- Automatic retries: Failed requests are retried 3 times by default (configurable per-prompt)
- Text responses: If model returns text instead of image, saves to
.txtfile with warning - Partial failures: Continues rendering remaining prompts if one fails
- Summary report: Shows successful, text responses, and failed renders
Pattern Types
concept (default)
Extracts ### Concept X.Y: Title style prompts with section headers.
numbered
Extracts ### X.Y Title style prompts (no "Concept" keyword).
simple
Extracts all level-3 headings as prompts.
Environment Variables
Create a .env file in the project root:
# Required
POE_API_KEY=your_api_key_here
# Optional
POE_DEFAULT_MODEL=Nano-Banana
Development
Project Structure
batch-renderer/
├── src/batch_renderer/
│ ├── __init__.py
│ ├── __main__.py
│ ├── cli.py # CLI interface
│ ├── config.py # Configuration management
│ ├── patterns.py # Prompt extraction patterns
│ └── renderer.py # Image rendering
├── docs/
│ ├── adr/ # Architecture Decision Records
│ └── SAMPLE-CONCEPTS.md
├── setup.py
├── Pipfile
└── README.md
Running Tests
# Dry run with test file
pipenv run batch-renderer test_prompts.md --dry-run
# Dry run with full sample
pipenv run batch-renderer docs/SAMPLE-CONCEPTS.md --dry-run
Architecture Decisions
See docs/adr/ for detailed design decisions:
Troubleshooting
"POE_API_KEY not found"
Make sure you've created a .env file with your API key, or pass it via --api-key.
"No prompts found in file"
Check that your markdown file uses the correct pattern format. Use --dry-run to debug extraction.
Model returns text instead of image
This can happen if:
- The model doesn't support image generation
- The model name is incorrect
- The prompt is ambiguous
The tool will save the text response to a .txt file for inspection.
License
MIT
Author
Jérémie Lumbroso with Claude Sonnet 4.5
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
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 batch_renderer-1.0.0.tar.gz.
File metadata
- Download URL: batch_renderer-1.0.0.tar.gz
- Upload date:
- Size: 41.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f3c9fa3a0b9ae9d879386c4003cc9b0b7e3d77548023d0508150e1d5ef42be8a
|
|
| MD5 |
861c23282757861550b1ffd66ab448c9
|
|
| BLAKE2b-256 |
5bcd8edc2d037a01a1c606cc0a41d3d3ab772bbc4c8f50294ce5b348822129cb
|
Provenance
The following attestation bundles were made for batch_renderer-1.0.0.tar.gz:
Publisher:
release.yml on jlumbroso/batch-renderer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
batch_renderer-1.0.0.tar.gz -
Subject digest:
f3c9fa3a0b9ae9d879386c4003cc9b0b7e3d77548023d0508150e1d5ef42be8a - Sigstore transparency entry: 1188037797
- Sigstore integration time:
-
Permalink:
jlumbroso/batch-renderer@9081de40304381abd36af8b4074645313f43a299 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/jlumbroso
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9081de40304381abd36af8b4074645313f43a299 -
Trigger Event:
push
-
Statement type:
File details
Details for the file batch_renderer-1.0.0-py3-none-any.whl.
File metadata
- Download URL: batch_renderer-1.0.0-py3-none-any.whl
- Upload date:
- Size: 40.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4e45494bc760b7ddbf0466075c62510abc6bb4a452b755c7116f27327905e352
|
|
| MD5 |
5f1fdb1e385529bcaa4f2091b6f143b1
|
|
| BLAKE2b-256 |
e67f67716b118e6dc2c6fe08d2fb93ba210a2387ffac53dfe75be8f641acc28b
|
Provenance
The following attestation bundles were made for batch_renderer-1.0.0-py3-none-any.whl:
Publisher:
release.yml on jlumbroso/batch-renderer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
batch_renderer-1.0.0-py3-none-any.whl -
Subject digest:
4e45494bc760b7ddbf0466075c62510abc6bb4a452b755c7116f27327905e352 - Sigstore transparency entry: 1188037814
- Sigstore integration time:
-
Permalink:
jlumbroso/batch-renderer@9081de40304381abd36af8b4074645313f43a299 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/jlumbroso
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9081de40304381abd36af8b4074645313f43a299 -
Trigger Event:
push
-
Statement type: