FLUX 3 Image Klein

FLUX 3 Image Klein is the distilled checkpoint of Black Forest Labs' open-weights FLUX 3 image model, covering text-to-image generation and reference-based editing in a single model. It is built for speed without giving up quality, which suits interactive applications, rapid iteration, and high-volume production.

Complete technical specification for integration
Ready-to-use code snippets for common workflows
Step-by-step tutorials for advanced use cases
← All GuidesRendering text
How to render readable text with FLUX 3 Image Klein: quoting the exact words, controlling the text you didn't ask for, building a layout hierarchy, and editing signage.
Introduction
FLUX 3 Image Klein spells out text you put in quotation marks, letter for letter, in the size and position the prompt gives it. Text the prompt only describes, or never mentions, comes out as lettering-shaped texture instead, so the rule behind every example in this guide is that each string that matters is written into the prompt.

A screen-printed poster for a summer concert series on textured off-white paper, full frame and straight on. At the top, the title "PARK SESSIONS" in huge condensed bold black capitals spanning the full width. Below it, a flat illustration of a small open-air stage under string lights in a city park, with a crowd on picnic blankets seen from behind, in coral, teal and black. Under the illustration, in medium bold type: "EVERY THURSDAY IN JULY". At the bottom, in small caps: "RIVERSIDE LAWN · 7PM · FREE ENTRY". The stage and the crowd carry no other lettering. Two-color risograph look with slight ink grain, generous margins, clean grid layout.
All three lines come out exactly as written, including the middle dots in the footer, and the stage carries no stray lettering because the prompt says so. This guide covers why quotation marks matter, how to deal with text you didn't ask for, how to build a layout with several levels of text, and how to change the text in an existing photo.
Quoting the exact text
Describing text is not the same as writing it. A prompt that says "the brand name" asks for something shaped like a brand name, and the model draws letters that spell nothing. Put the words in quotation marks and they render as written.

A product photo of a matte kraft-paper coffee bag with a white rectangular front label, standing on a light oak counter. The label shows the brand name in bold black serif capitals, the origin in small italic type underneath and the weight in the bottom right corner. A few roasted coffee beans scattered in front of the bag. Soft daylight from the left, shallow depth of field, straight-on shot at bag height. Clean e-commerce packaging photography, warm neutral palette.

A product photo of a matte kraft-paper coffee bag with a white rectangular front label, standing on a light oak counter. The label reads "ALTITUDE ROAST" in bold black serif capitals, with "Single origin · Huila, Colombia" in small italic type underneath and "250 g" in the bottom right corner of the label. A few roasted coffee beans scattered in front of the bag. Soft daylight from the left, shallow depth of field, straight-on shot at bag height. Clean e-commerce packaging photography, warm neutral palette.
Both prompts ask for the same three lines in the same typefaces and positions, and both images share a seed. The first label invents its words and even prints the placeholder "Weight". The second spells "ALTITUDE ROAST", the origin line and "250 g" exactly, keeping the italic and the corner placement the prompt asked for.
Controlling the text you didn't ask for
Signs and screens appear in scenes whether or not the prompt mentions them, and any surface that would normally carry lettering gets some. When the prompt doesn't supply the words, the model fills those surfaces with pseudo-text.

A straight-on street photo of a row of three small shops on a sunny morning. The middle shop is a florist with a dark green fascia carrying the name "WILD STEM" in white sans-serif capitals, buckets of tulips on the pavement in front. To its left a hardware store and to its right a bakery, both with signs above their windows. Soft morning sun from the right. Photoreal street photography, 35mm lens, warm palette.

A straight-on street photo of a row of three small shops on a sunny morning. The middle shop is a florist with a dark green fascia carrying the name "WILD STEM" in white sans-serif capitals, buckets of tulips on the pavement in front. To its left a hardware store with a plain gray fascia and no lettering, and to its right a bakery with a plain cream fascia and no lettering. No signs, posters or lettering in any of the shop windows. Soft morning sun from the right. Photoreal street photography, 35mm lens, warm palette.
In the first image the florist is correct and the hardware store's sign reads as nonsense, with more of it on small cards in the windows. The second prompt gives every other surface a state: plain fascias with no lettering, and no signs in any window. The result has exactly one piece of text in it. Either quote the words a surface should carry or say it is blank, and remember the small surfaces, such as window cards and price tags.
Building a layout hierarchy
Layouts with several pieces of text work when each string has its own size, weight and position in the prompt. Position words such as "in the upper third" and "at the bottom" decide where each one lands.

A clean social media ad for a meal-planning app, flat graphic design on a soft mint background. In the upper third, the headline "Dinner, sorted." in large bold dark green sans-serif type, and under it the line "Plan a week of meals in 5 minutes" in smaller regular type. In the center, a smartphone mockup tilted slightly, its screen showing the title "This week" at the top and three rows of food photos labeled "Mon", "Tue" and "Wed", with no other text on the screen. At the bottom, a rounded coral button with the label "Try it free" in white bold type. Generous margins, modern minimal app marketing style.
import { createClient } from '@runware/sdk'
const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()
const [result] = await client.run({
model: 'bfl:flux@3-image-klein',
positivePrompt: 'A clean social media ad for a meal-planning app, flat graphic design on a soft mint background. In the upper third, the headline "Dinner, sorted." in large bold dark green sans-serif type, and under it the line "Plan a week of meals in 5 minutes" in smaller regular type. In the center, a smartphone mockup tilted slightly, its screen showing the title "This week" at the top and three rows of food photos labeled "Mon", "Tue" and "Wed", with no other text on the screen. At the bottom, a rounded coral button with the label "Try it free" in white bold type. Generous margins, modern minimal app marketing style.',
width: 1088,
height: 1360
})import asyncio
import os
from runware import Runware
async def main():
async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
results = await client.run({
"model": "bfl:flux@3-image-klein",
"positivePrompt": "A clean social media ad for a meal-planning app, flat graphic design on a soft mint background. In the upper third, the headline \"Dinner, sorted.\" in large bold dark green sans-serif type, and under it the line \"Plan a week of meals in 5 minutes\" in smaller regular type. In the center, a smartphone mockup tilted slightly, its screen showing the title \"This week\" at the top and three rows of food photos labeled \"Mon\", \"Tue\" and \"Wed\", with no other text on the screen. At the bottom, a rounded coral button with the label \"Try it free\" in white bold type. Generous margins, modern minimal app marketing style.",
"width": 1088,
"height": 1360
})
asyncio.run(main())curl https://api.runware.ai/v1 \
-H "Authorization: Bearer $RUNWARE_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{
"taskType": "imageInference",
"taskUUID": "8c9d0e1f-2a3b-4c4d-9e5f-6a7b8c9d0e1f",
"model": "bfl:flux@3-image-klein",
"positivePrompt": "A clean social media ad for a meal-planning app, flat graphic design on a soft mint background. In the upper third, the headline \"Dinner, sorted.\" in large bold dark green sans-serif type, and under it the line \"Plan a week of meals in 5 minutes\" in smaller regular type. In the center, a smartphone mockup tilted slightly, its screen showing the title \"This week\" at the top and three rows of food photos labeled \"Mon\", \"Tue\" and \"Wed\", with no other text on the screen. At the bottom, a rounded coral button with the label \"Try it free\" in white bold type. Generous margins, modern minimal app marketing style.",
"width": 1088,
"height": 1360
}
]'runware run bfl:flux@3-image-klein \
positivePrompt="A clean social media ad for a meal-planning app, flat graphic design on a soft mint background. In the upper third, the headline \"Dinner, sorted.\" in large bold dark green sans-serif type, and under it the line \"Plan a week of meals in 5 minutes\" in smaller regular type. In the center, a smartphone mockup tilted slightly, its screen showing the title \"This week\" at the top and three rows of food photos labeled \"Mon\", \"Tue\" and \"Wed\", with no other text on the screen. At the bottom, a rounded coral button with the label \"Try it free\" in white bold type. Generous margins, modern minimal app marketing style." \
width=1088 \
height=1360{
"taskType": "imageInference",
"taskUUID": "8c9d0e1f-2a3b-4c4d-9e5f-6a7b8c9d0e1f",
"model": "bfl:flux@3-image-klein",
"positivePrompt": "A clean social media ad for a meal-planning app, flat graphic design on a soft mint background. In the upper third, the headline \"Dinner, sorted.\" in large bold dark green sans-serif type, and under it the line \"Plan a week of meals in 5 minutes\" in smaller regular type. In the center, a smartphone mockup tilted slightly, its screen showing the title \"This week\" at the top and three rows of food photos labeled \"Mon\", \"Tue\" and \"Wed\", with no other text on the screen. At the bottom, a rounded coral button with the label \"Try it free\" in white bold type. Generous margins, modern minimal app marketing style.",
"width": 1088,
"height": 1360
}Response
{
"data": [
{
"taskType": "imageInference",
"taskUUID": "8c9d0e1f-2a3b-4c4d-9e5f-6a7b8c9d0e1f",
"imageUUID": "3e4f5a6b-7c8d-4e9f-a0b1-c2d3e4f5a6b7",
"imageURL": "https://im.runware.ai/image/os/a14d18/ws/2/ii/3e4f5a6b-7c8d-4e9f-a0b1-c2d3e4f5a6b7.jpg"
}
]
}The headline, the subline, the screen labels and the button keep their relative sizes, and the comma and the period in "Dinner, sorted." survive. The phone screen is the part that needs care: the labels inside it are quoted like any other text, and the clause "with no other text on the screen" keeps the rest of the interface clean. An unscripted app screen is one of the surfaces that fills up with pseudo-text fastest.
Editing text in a photo
Text in an existing image can be changed with a reference and an instruction. Quote the new words and name the typeface you want to keep, so the replacement matches the lettering it replaces.
The new name takes the gold serif and the position of the old one, and the chalkboard keeps its hand lettering. That makes one photo of a storefront or a package reusable across names or promotions: change the words and keep the shot.
Tips for best results
-
Quote every string you want to read. Text that is only described comes back as invented letters.
-
Give each string a size and a place. "Huge condensed capitals at the top" and "small caps at the bottom" build the hierarchy for you.
-
Set every other text surface to blank. Neighboring signs and app screens fill with pseudo-text unless the prompt quotes their words or says they are plain.
-
Script the screens. A phone or laptop in an ad needs its interface text quoted, plus a clause saying there is nothing else on it.
-
Keep strings short. Every example here is a headline, a label, a sign or a button. Set long body copy in a layout tool afterwards.
-
Name the typeface when you edit. "In the same gold serif letters" keeps a replacement consistent with the lettering around it.

