Flux 2 in Pure C: Zero‑Dependency Image Generation
Discover how Flux 2, the latest text‑to‑image model from Black Forest Labs, can be run entirely in C without Python or CUDA. This project brings a lightweight, memory‑efficient, GPU‑accelerated image generation engine to any macOS or Linux machine using only the C standard library or optional BLAS/MPS backends. From building the binary to interactive CLI mode, multi‑reference conditioning, and embedded text encoder, the guide covers every step to generate stunning images right from your terminal. Ideal for developers, researchers, and hobbyists who need fast, portable inference without heavy runtime dependencies.
Flux 2 in Pure C: Zero‑Dependency Image Generation
Flux 2 is the new wave of latent‑diffusion models that can turn prompts into stunning images in four sampling steps. Black Forest Labs released the small “Klein” variant with just 4 B parameters, but the inference code remains large—16 GB of weights. Flux 2‑c gives you a fast, lightweight, pure C implementation that runs on macOS or Linux without requiring Python, CUDA, or a full ML stack.
Why a C implementation?
- Zero external runtime – Only the C standard library is required, making the binary portable across environments that can compile C.
- Memory‑mapped weights – The default
--mmapmode keeps the 16 GB safetensors on‑disk and loads them on‑demand, bringing peak memory down to ~4–5 GB. - GPU acceleration (optional) – Apple Metal (MPS) on Macs or BLAS on Intel/Linux gives a ~30× speedup compared to the pure‑C baseline.
Quick Start
# 1. Clone the repo
git clone https://github.com/antirez/flux2.c
cd flux2.c
# 2. Choose a backend
make mps # Apple Silicon (fastest)
# make blas # Intel Mac / Linux with OpenBLAS
# make generic # Pure C, no dependencies
# 3. Download the 16 GB model
./download_model.sh # shell script (curl)
# or: pip install huggingface_hub && python download_model.py
# 4. Run the demo
./flux -d flux-klein-model \
-p "A woman wearing sunglasses" \
-o output.png
The image appears immediately in the terminal if it supports the Kitty protocol.
Features at a Glance
| Feature | Description |
|---|---|
| Text‑to‑Image | Generate images from prompts in any resolution (64–1792 px). |
| Image‑to‑Image | Use existing images as reference via in‑context conditioning. |
| Multi‑Reference | Combine up to 16 reference images for composites. |
| Interactive CLI | Omit -p to start an REPL that remembers reference IDs. |
| Terminal image preview | --show / --show-steps display images directly in Kitty/Ghostty/iTerm2. |
| Zero‑Dependency API | Export a simple C library (libflux.a) with flux_generate() and flux_img2img(). |
| Metadata‑rich PNGs | Images include seed and model info in PNG metadata for reproducibility. |
| Benchmarks | On an M3 Max with 4 steps, pure‑C MPS generates 512×512 in ~13 s, matching PyTorch. |
Building From Source
Prerequisites – a C compiler, optionally OpenBLAS for the blas target or Apple Accelerate for mps.
# On macOS
clang -framework Accelerate -o flux flux.c flux_h*.c ...
# On Linux via OpenBLAS
gcc -fopenmp -L/usr/lib -lopenblas -o flux flux.c flux_h*.c ...
Run make to list available backends. Each target builds a binary that automatically selects the fastest path for your platform.
Using the Library in Your Own Project
#include "flux.h"
#include <stdio.h>
int main(void) {
flux_ctx *ctx = flux_load_dir("flux-klein-model");
if (!ctx) { printf("Failed: %s\n", flux_get_error()); return 1; }
flux_params p = FLUX_PARAMS_DEFAULT;
p.width = 512; p.height = 512; p.seed = 42;
flux_image *img = flux_generate(ctx, "A fluffy orange cat", &p);
if (!img) { printf("Error: %s\n", flux_get_error()); return 1; }
flux_image_save(img, "cat.png");
flux_image_free(img);
flux_free(ctx);
return 0;
}
Compile with gcc -o myapp myapp.c -L. -lflux -lm -framework Accelerate (macOS) or the OpenBLAS equivalent.
Debugging & Compare With Python
The repo ships a debug/ folder with Python scripts that dump the exact tensors from the Black Forest reference implementation. Run the C binary with --debug-py to verify pixel‑perfect parity.
./flux -d flux-klein-model --debug-py -o c_debug.png
This is invaluable for sanity checks when tweaking model weights or tokenizers.
FAQ
| Question | Answer |
|---|---|
| Can I use it on Windows? | Yes – a C compiler and the optional BLAS library will build the binary; MPS is exclusive to macOS. |
| Do I need a GPU? | Not strictly; the generic build runs on CPU. GPU backends simply accelerate inference. |
| What about the 16 GB download? | The binary can run with memory‑mapped weights (--mmap), letting 8‑GB systems generate images without loading the entire model into RAM. |
Conclusion
Flux 2‑c brings state‑of‑the‑art image generation to developers who want performance without the bloat of a Python runtime or CUDA. Its tiny footprint, optional GPU support, and the ability to embed the library in C/C++ projects make it ideal for embedded systems, edge computing, or just a fun CLI tool for artists. Clone, build, and start creating—your terminal can now paint masterpieces for free.