How to Write Better Flux 3 Prompts: Boxes, Text, Edits
Flux 3 prompts can carry a layout. Here's how to write captions, place text, draw bounding boxes on the 0 to 1000 grid, and run clean multi-reference edits on each::labs.

Most image prompts are wishes. You type "a café sign on the left, a cat on the step, the logo up top", hit generate, and the model hears a vibe instead of a floor plan. The cat lands in the middle, the sign drifts, and the headline comes back with one letter missing. You didn't write a bad prompt. You wrote a prompt that had no way to say where.
Flux 3 prompts can. Black Forest Labs built Flux 3 so a caption can carry a layout: tag an element in the text, give it a box on a 0 to 1000 grid, and the model puts it there. The same idea runs through editing, where boxes replace the masks you might be used to. This guide covers both Flux 3 Text to Image and Flux 3 Edit on each::labs, from the plain caption up to multi-reference composites, with prompts you can paste and run.
One opinion up front: boxes are not a power-user extra. Once your image has more than two things in it that need to be in particular places, writing the layout is faster than rerolling until luck does it for you.
Write the Caption Like a Shot List
Every Flux 3 prompt starts with a caption, and the caption still does most of the work. BFL's own advice is blunt: specific visual descriptions beat labels. "A man" is a label. "A man in his sixties with a cropped white beard, a rust-colored wool overshirt and reading glasses pushed up on his forehead" is a picture. The model can draw the second one. The first one it has to guess.
Think like a photographer: subject, action, place, light, lens. Material words pay off more than quality adjectives. "Brushed aluminum", "wet cobblestone", "sun-faded canvas" tell the model how to render a surface. "Stunning, ultra-detailed, masterpiece" tells it nothing it can act on.
A narrow bakery counter at 7am, a woman in a flour-dusted navy apron sliding a tray of cardamom buns onto a marble shelf, low warm window light from the left, steam rising off the tray, shot at eye level on a 35mm lens, shallow depth of field.
That caption works on its own. Everything below is about what you add when "on its own" isn't precise enough. If you want the longer backstory on how BFL's models read prose, our older guide on writing better prompts for Flux AI still holds up as a foundation.

Give Text Its Own Box and Its Exact Words
BFL says Flux 3 renders high-accuracy text in multiple languages and that text generation improved significantly over earlier FLUX releases. You still have to ask properly. Put the exact words in quotes, and when you're using a layout, give the text its own box with those quoted words in its description. Don't fold the headline into the description of the poster it sits on. A sign is one element; the words on the sign deserve a row of their own.
Be literal about the type ("bold condensed sans serif, cream letters") and keep the copy short. A three-word headline in a generous box is a request the model can meet.

How Flux 3 Bounding Boxes Work in Text to Image
Here's the syntax. In the caption, tag each element you want to place with an id in angle brackets, like <cat_1>. After the caption, add a space and then a JSON array with one row per tagged element. Each text-to-image row has three fields: id, bbox and desc.
The box is [top, left, bottom, right], integers on a 0 to 1000 grid. Zero is the top or left edge, 1000 is the bottom or right edge. Because the grid is relative, the same layout works at any resolution. BFL's bounding box docs have the full reference if you want it.
A rain-soaked side street at dusk, a narrow café <cafe_front> with a green tiled facade, a hand-painted sign <cafe_sign> above the door, and a gray tabby cat <cat_1> sitting on the stone step. [{"id": "cafe_front", "bbox": [150, 300, 1000, 750], "desc": "narrow café facade covered in glossy green ceramic tiles, wooden door with a brass handle, warm light spilling from the window"}, {"id": "cafe_sign", "bbox": [180, 360, 300, 690], "desc": "hand-painted wooden sign with cream serif letters reading \"CASA VERDE\""}, {"id": "cat_1", "bbox": [780, 420, 960, 580], "desc": "gray tabby cat with white paws sitting upright on a wet stone step, looking at the camera"}]Notice what the rows do and don't repeat. The caption sets the scene and mood. The rows carry placement and the specific look of each tagged thing. Name every element distinctly, so only one thing can match each id. And keep overlap to a minimum; where boxes must overlap, like the sign on the facade, order the rows back to front.
Design Boxes for the Aspect Ratio You Send
This is the mistake that bites everyone once. The 0 to 1000 grid stretches with the frame, so on anything other than 1:1, a grid unit is not the same size horizontally and vertically. On a 16:9 image, 100 units of width cover much more distance in pixels than 100 units of height do.
The practical rule: pick your aspect_ratio first, then draw the boxes. On 16:9, a box that should look square in pixels needs roughly 1.8 times as many units tall as it is wide, so 200 wide by about 356 tall. On 9:16, flip it. If you leave aspect_ratio on auto, the model picks the frame, which is fine for a plain caption and a gamble for a layout. When boxes matter, set the ratio yourself. On each::labs you get the full range, from 21:9 down to 9:21.

Size Boxes So Things Actually Appear
Boxes that are too small fail quietly. BFL notes that in its tests, a new element in a box of roughly 40 by 25 pixels often didn't show up at all. So give new content room. If a detail is small in the final image, make its box a little bigger than the object and let the description say "small". The model is better at shrinking something inside a generous box than at inventing something inside a cramped one.
Flux 3 Edit Prompts: Anchors vs Moves
Flux 3 Edit has no mask input. You target regions with boxes in the prompt instead. Edit rows have more fields: id, from (which reference the element comes from, or null for something newly generated), src_bbox (where it is now), tgt_bbox (where it should be) and desc. BFL's docs also label rows with a kind: new, move or anchor.
The logic is simple once you see it. Same source and target box means anchor: keep this exactly where it is. Different boxes means move. A null source with a target box means add something new there. BFL's docs write the first reference as ref_image_0 in the rows, so the numbering in the JSON starts at zero.
In <ref_image_0>, move the red bicycle <bike_1> from the left of the doorway to the right, add a terracotta pot of rosemary <pot_1> where the bicycle stood, and keep the blue door <door_1> untouched. [{"id": "bike_1", "from": "ref_image_0", "src_bbox": [420, 80, 900, 380], "tgt_bbox": [420, 620, 900, 920], "desc": "red vintage city bicycle with a wicker front basket", "kind": "move"}, {"id": "pot_1", "from": null, "src_bbox": null, "tgt_bbox": [640, 140, 900, 320], "desc": "terracotta pot with a bushy rosemary plant, slightly weathered rim", "kind": "new"}, {"id": "door_1", "from": "ref_image_0", "src_bbox": [200, 400, 900, 600], "tgt_bbox": [200, 400, 900, 600], "desc": "painted blue wooden door with an iron knocker", "kind": "anchor"}]Two habits make edits behave. First, state every addition and removal twice: once in the prose and once in the rows. Second, anchor the surroundings in complex edits. Pixels outside your boxes typically stay unchanged, but BFL is clear that shadows, reflections and nearby lighting may still shift. An anchor row around the thing you care about most is the simplest insurance.

Referring to Image 1, Image 2 and Beyond
Flux 3 Edit takes up to ten references through image_urls, and in your prose you refer to them as Image 1, Image 2 and so on, in upload order. Upload order matters twice: it sets the numbering, and with aspect_ratio on auto, the output follows the first reference's shape. Put your base scene first.
The woman from image 1 wears the denim jacket from image 2 and stands in the kitchen from image 3, leaning on the counter by the window, morning light, the jacket's brass buttons clearly visible.
Each reference needs to be at least 256 by 256 pixels and no larger than 16 MP. More isn't automatically better: bring the images that carry something words can't, like a face, a product's exact shape or a specific room. If a composite gets muddled, drop a reference before you add another sentence.
When to Keep Grounding On, and When to Switch It Off
Both Flux 3 image models on each::labs have a grounding switch, on by default. It lets the model research your prompt with web and image search before it generates. That's what BFL's setting does. When to use it is our advice, not theirs.
Keep it on when the prompt leans on the real world: a named landmark, a real product, a specific city's architecture, something that happened recently. Those are exactly the things where looking first should beat remembering. Turn it off when the scene is fully invented. A fictional creature in an imaginary market doesn't need a search, and you don't want the model pulling in real-world look-alikes for a name you made up. If your made-up brand happens to share a name with a real company, switching grounding off is the cleanest way to keep it yours.
Draft at 1K, Finish at 4K
Resolution is a workflow choice. On each::labs you can pick 768sq (around 0.6 MP), 1k (around 1 MP, the default), 2k (around 4 MP) and 4k (around 16 MP), and 4k can take several minutes. So don't iterate at 4k. Lock the layout, the copy and the boxes at 768sq or 1k, where a bad box costs you seconds, then rerun the winning prompt at 2k or 4k for delivery. Because boxes live on a relative grid, the layout carries over unchanged. That's the quiet benefit of the 0 to 1000 system: your draft is a real draft of the final.
Common Flux 3 Prompt Mistakes
Drawing boxes before choosing the aspect ratio. Every box is relative to the frame, so a ratio change after the fact squashes your layout. Choose first.
Burying text inside another element. The headline gets its own row, the exact words go in quotes, and the box is big enough to hold them.
Vague ids. <thing_1> and <thing_2> tell the model nothing. <red_bicycle> does. Without boxes, the model tries to locate and box a named element itself, so a distinct name helps even when you skip the JSON.
Prose and rows that disagree. If the JSON adds a lamp and the caption never mentions it, expect confusion. Say it in both places.
Using Flux 3 Edit like a masked inpainter. If you have a mask-first habit, Flux Fill Pro still exists for that. Flux 3 wants boxes and words.
If you're coming from the earlier generation, Flux 2 Pro and Flux.1 Kontext Pro are still on each::labs for side-by-side tests. And if motion is next, the same family's video side follows the same "direct, don't wish" mindset, which we covered in our look at Flux 3 video. For the rest of the catalog, browse text-to-image models.
Frequently Asked Questions
Do Flux 3 prompts need bounding boxes?
Not at all. A strong caption alone gets you a good image, and plenty of edits work as one plain sentence. Boxes earn their place when position matters: a layout with several placed elements, text that has to sit in a specific spot, or an edit where "the one on the left" could mean two things.
What does the 0 to 1000 grid mean for my image size?
Nothing, which is the point. Coordinates are fractions of the frame, so the same rows work at 768sq or 4k. They do depend on aspect ratio, because the grid stretches with the frame, so set the ratio before you draw the boxes.
How many reference images can Flux 3 Edit use?
Up to ten, passed in image_urls and called Image 1, Image 2 and so on in upload order. In practice, two or three well-chosen references usually beat ten loosely related ones.
Why did something outside my box change?
Light travels. BFL notes that pixels outside the boxes usually stay the same, but shadows, reflections and nearby lighting can still move with the edit. Add anchor rows around the regions you need frozen, and describe the light you want in the caption.