Your starting point
A reusable JSON composition, a coordinate-check result, and a clear acceptance record for a poster image and its revision.
Before you begin. A browser with access to the public MOSS-Image Space. Python 3.9 or later is optional for the original coordinate checker. The exercise uses MOSS-Image-Base and a 1024×1024 canvas. Image generation was not executed for this guide.
Product details and verification
OpenMOSS released public Base and SFT code and weights on October 16. Source ↗
The Base user guide describes experimental JSON layouts using centered pixel coordinates in yxyx order. Source ↗
The public demo exposes model, prompt, dimensions, seed and step controls. It was inspected without running generation. Source ↗
The original Python coordinate checker passed the supplied fixture and rejected reversed, oversized and missing-text fixtures on Python 3.9.6. The public demo and documentation were read October 17. Model inference, poster quality and the full workflow were not executed.
A poster has a few jobs: tell someone what is happening, make the important words readable, and leave enough space for the picture. This exercise turns those jobs into checks you can perform. The fictional event is called REPAIR CAFE, with the time SATURDAY 10-12. There is no real venue, organizer or booking link.
MOSS-Image is an open image-model family released by OpenMOSS on October 16. The public interface gives you a way to try a composition without starting with a local model installation. The exercise preserves your layout as a text file, so you can explain exactly what you asked the model to make.
1. Set the finished output before generating
Make one square image containing the two exact text strings and one orange desk lamp. The title belongs above the picture; the time belongs below it. Keep the cream background and dark green lettering. You should be able to read both lines when the image is shown at 320 pixels wide.
Keep a folder containing poster.json, your saved image and a short review record. A successful result has correct wording, sensible spacing and an obvious reading order. A beautiful picture with a misspelled title fails this task. Do not add real event details until the fictional version passes.
2. Save the complete layout prompt
Copy the following JSON into a plain UTF-8 file named poster.json. It is an original exercise fixture. A bounding box describes the requested rectangular area for an item. For this 1024-pixel square, coordinates run from -512 to 512 around the center; the order is top, left, bottom, right.
The three boxes deliberately leave gaps. The title has a wide band at the top, the illustration occupies the middle, and the time sits near the bottom. These are requested regions, so the generated image still needs a visual check.
{
"summary": {
"meta": [
"poster"
],
"canvas": "single",
"caption": "A square poster for a fictional repair cafe. Warm cream paper, dark green lettering, and a simple orange desk-lamp illustration. Use only the two supplied text strings. Keep generous empty space around each element."
},
"items": [
{
"label": "text",
"caption": "Large dark green uppercase title centered near the top.",
"text": "REPAIR CAFE",
"bbox": [
-420,
-410,
-270,
410
]
},
{
"label": "object",
"caption": "One simple orange desk lamp with a wide base, drawn as a flat illustration.",
"bbox": [
-200,
-220,
190,
220
]
},
{
"label": "text",
"caption": "Smaller dark green time label centered below the illustration.",
"text": "SATURDAY 10-12",
"bbox": [
280,
-350,
390,
350
]
}
],
"bbox_coord_space": "abs_centralized",
"bbox_format": "yxyx"
}3. Check the numbers before judging the model
If you have Python, save the next block as check_layout.py in the same folder. It uses only the standard library and does not contact a service. The helper checks this fixture’s geometry and required text; it is not a validator for every feature of the model’s input format.
Open a terminal in that folder and run the command below. Compare the printed corners with the expected output. The title starts 102 pixels from the left and 92 pixels from the top. The time starts 162 pixels from the left and 792 pixels from the top. These positions give you a simple reference when you inspect the image.
import json
import sys
from pathlib import Path
def check(layout, width=1024, height=1024):
if width <= 0 or height <= 0 or width % 16 or height % 16:
raise ValueError("Dimensions must be positive multiples of 16")
if layout.get("bbox_format") != "yxyx":
raise ValueError("Use yxyx coordinate order")
if layout.get("bbox_coord_space") != "abs_centralized":
raise ValueError("Use centered pixel coordinates")
items = layout.get("items")
if not isinstance(items, list) or not items:
raise ValueError("Provide at least one item")
for i, item in enumerate(items, 1):
box = item.get("bbox")
if not isinstance(box, list) or len(box) != 4:
raise ValueError(f"Item {i}: expected four coordinates")
if any(type(v) not in (int, float) for v in box):
raise ValueError(f"Item {i}: coordinates must be numbers")
y0, x0, y1, x1 = box
if not (-height/2 <= y0 < y1 <= height/2
and -width/2 <= x0 < x1 <= width/2):
raise ValueError(f"Item {i}: reversed or out-of-bounds box")
if item.get("label") == "text" and not item.get("text", "").strip():
raise ValueError(f"Item {i}: missing text")
print(f"Item {i}: top-left=({x0+width/2:g}, {y0+height/2:g}), "
f"bottom-right=({x1+width/2:g}, {y1+height/2:g})")
print(f"PASS: {len(items)} boxes fit a {width}x{height} canvas")
if __name__ == "__main__":
try:
check(json.loads(Path(sys.argv[1]).read_text(encoding="utf-8")))
except (IndexError, OSError, ValueError, KeyError, TypeError) as error:
raise SystemExit(f"FAIL: {error}")python3 check_layout.py poster.jsonItem 1: top-left=(102, 92), bottom-right=(922, 242)
Item 2: top-left=(292, 312), bottom-right=(732, 702)
Item 3: top-left=(162, 792), bottom-right=(862, 902)
PASS: 3 boxes fit a 1024x1024 canvasThe supplied fixture passed this check. Deliberately reversed, oversized and missing-text variants failed. If Python is unavailable, you can still use the prompt: compare the four numbers of each box with the coordinate convention above and record that the automatic check was skipped. A passing geometry check says nothing about the quality of a generated image.
4. Try one image in the public demo
Open the MOSS-Image public demo from Source documentation below. Select MOSS-Image-Base. Paste the complete JSON into Prompt. Set width and height to 1024, image count to 1, seed to 42 and steps to 50. Leave other settings at their displayed defaults and record them in your notes. This guide follows the Base layout documentation; it does not assume that another checkpoint will follow the same composition.
Press Generate only when the interface offers access you are comfortable using. A queue, account requirement or resource limit can prevent a run. The public page did not establish a guaranteed free allowance or completion time. Stop if it requires an unexpected purchase; you can keep the prepared fixture for a later attempt.
When an image is returned, save it using the result’s download control if available. If saving is unavailable, record that export remains unverified. Preserve the exact prompt and settings with the image. No model inference was performed when preparing this article; these are documentation-based instructions for your own trial.
5. Accept or reject the visible result
Check wording first, then placement, then appearance. Read each character in REPAIR CAFE and SATURDAY 10-12. Reject extra words, invented logos and an incorrect time. View the image at 320 pixels wide to check whether the text still works on a phone.
The lamp should sit between the two text bands without covering them. Use the expected corner coordinates as a reference for the composition, allowing for visual margins inside each box. If the text is right but the illustration crosses a band, record a placement failure. If the composition is right but letters are malformed, record a lettering failure. Keeping those outcomes separate makes the next change clearer.
Input file: poster.json
Model: MOSS-Image-Base
Canvas: 1024x1024
Seed: 42
Steps: 50
Other displayed settings: record their actual values
Exact title: PASS / FAIL
Exact time: PASS / FAIL
No additional text or logos: PASS / FAIL
Title above lamp, time below lamp: PASS / FAIL
Both lines readable at 320px wide: PASS / FAIL
Saved output filename: record the actual filename
Decision: ACCEPT only when every visual check passes
Observed failure and next edit: describe one issue6. Make one measurable revision
For a second attempt, change only the lamp box to [-200,-300,190,140]. This moves the requested region 80 pixels left while preserving its size. Keep the canvas, seed, wording and other settings unchanged. Save the changed prompt as poster-left.json and rerun the coordinate helper.
Compare the two images side by side. The lamp should move left while both text lines remain readable and correctly spelled. A fixed seed helps keep the comparison controlled, but it does not guarantee identical pixels across a changed prompt, model build or runtime. If the wording also changes, record that as an unintended revision.
Keep both versions even if the second looks worse. The useful output is a traceable design decision: what changed in the prompt, what changed in the image, and whether the result passed. The editable artifact here is the composition JSON; a raster image does not provide separate vector text and illustration layers.
When something fails
| Observed problem | Recovery |
|---|---|
| The checker rejects a box | Check top/left/bottom/right order and the -512 to 512 bounds. Re-run before generating. |
| The model prints JSON or ignores the composition | Confirm Base is selected and the entire JSON is in Prompt. Check the current user guide; experimental support may have changed. |
| Letters or numbers are incorrect | Keep the two short strings and ask for another attempt. If they remain unreliable, add final typography in a design editor and label the result as edited. |
| The demo is queued or unavailable | Save the fixture and retry normal access later. No local installation or paid service is required to complete the preparation steps. |
| A revision changes unrelated details | Return to the saved baseline and change one field. Record unintended differences instead of accepting them silently. |
For an actual event poster, finish with a human check of the venue, date, access information and permission to use any imagery. Those details are intentionally absent from this fictional exercise. Model weights being public does not remove inference costs: local use requires suitable hardware, and hosted access can have limits. Choose a deployment path only after the small composition test is useful to you.
Sources & next steps
GitHub · implementation
MOSS-Image code and release ↗
October 16 release makes Base and SFT code and weights public; repository explains the image family.
OpenMOSS · page checked 2026-10-17 · Published 2026-10-16
GitHub · official
MOSS-Image-Base user guide ↗
The experimental layout format defines centered pixel boxes and supported inference settings.
OpenMOSS · page checked 2026-10-17
More sources reviewed (2)
Hugging Face · official
MOSS-Image-SFT model card ↗
The public model card identifies the fine-tuned checkpoint, diffusion architecture and license.
OpenMOSS · page checked 2026-10-17
Hugging Face · demonstration
MOSS-Image public demo ↗
The live interface exposes Base selection, prompt, dimensions, seed and sampling controls. Generate was not pressed.
OpenMOSS · page checked 2026-10-17
Guide history
Revisions preserve the original instructions. A source recheck alone does not create a new revision.
Revision 1 · New original poster-layout exercise with complete JSON, a tested coordinate helper, exact browser steps, visual acceptance checks and a controlled revision. Image inference remains unexecuted.