02 Procedural generation · Art direction · Real-time 3D
Text-to-world generation
Designed worlds from a sentence.
The question
Can a sentence compose a world to an art director’s standard?Can a sentence compose a world to an art director’s standard?
Role
Concept, briefs, art direction, and system design
Years
2026
With
H3M
Status
Prototype
Disciplines
Procedural generation, Art direction, Real-time 3D, LLM agents
Constraint
Worlds must read as designed, not generated, and stay light enough for a phone.
Display rooms
Text to world procedural content
Ten of the 120 prompts, each built with reusable parts.Display-room prompts 01–120 and the sentence router — shared/worldgen/roomPrompts.ts and roomRouter.tsH3M — Portals repository, branch 2026-09-15-text-to-world, commit e5f65df43c · 2026-09-28Ryan’s prompts, in four series of thirty (01–30, juxtaposition 31–60, sport 61–90 and franchise 91–120). Each line quoted on the page is a phrase from these prompts in his wording; three (rooms 03, 10 and 19) are trimmed from longer sentences. The file is unchanged since 2026-09-28. A sentence opens a prebuilt room only when it names one; otherwise it composes a world.
03The Oxblood Supper Club“A glamorous dinner before the guests arrive.”
04The Saddlework Atelier“Oversized loops of cognac leather become the architecture of an abstract saddlery.”
10The Velvet Boxing Salon“The concentrated drama of an arena without requiring spectators.”
19The Riviera Afterimage“The sensation of an afternoon by the water.”
33The Ballroom Skatepark“Aristocratic formality × street movement.”
61The Court in Suspension“Lift, hang time, and impossible balance.”
62The Fourth-Quarter Tunnel“Pressure, preparation, and the moment before entry.”
63The Ice-Breaker“Impact, edge control, and cold intensity.”
64The Diamond After Dark“Ritual, craftsmanship, and the final inning.”
68The Last Mile at Sunrise“Persistence, personal achievement, and forward momentum.”
The lettering in these rooms, MAISON VALE, is a placeholder name. The logo, like every other item in a room, can be adjusted or swapped on its own.The house name is a setting, and a room is separate items — shared/worldgen/room_products.ts and harness/world/rooms.htmlH3M — Portals repository, commit 5b500db265 · 2026-09-28In the harness the house name stamped on a room’s pieces is a setting (MAISON VALE by default, and any other name on request), and a room’s items are separate components, each listed in the catalogue with its size; in the app a world’s pieces can each be selected, moved, turned, resized and deleted. Ryan, 2026-11-03: the logo, like every other item, can be adjusted or swapped on its own.
How it works
01/05
A sentence opens a prebuilt room when it names one, and composes a new world when it doesn’t. 120 written prompts set the bar.Display-room prompts 01–120 and the sentence router — shared/worldgen/roomPrompts.ts and roomRouter.tsH3M — Portals repository, branch 2026-09-15-text-to-world, commit e5f65df43c · 2026-09-28Ryan’s prompts, in four series of thirty (01–30, juxtaposition 31–60, sport 61–90 and franchise 91–120). Each line quoted on the page is a phrase from these prompts in his wording; three (rooms 03, 10 and 19) are trimmed from longer sentences. The file is unchanged since 2026-09-28. A sentence opens a prebuilt room only when it names one; otherwise it composes a world.
Drawn from the page’s own room and prompts; the new world is invented
02/05
Light and grade are data, not code: sixteen looks so far, ten of them taken from the rooms’ own light.Looks: light and grade as data — shared/worldgen/looks.tsH3M — Portals repository, branch 2026-09-15-text-to-world, commit 171379c00a · 2026-09-2816 looks. 10 are transcribed from the display rooms’ own light rigs, each checked against the room file it cites; the Oxblood Supper Club’s is “low tinted fill, one flagged neutral key”. 6 are authored for spoken worlds and not yet rendered.
Drawn: the supper club’s look as the page describes it
03/05
Every piece is a named, measured component, catalogued for any world to draw on: 1,576 from the 120 rooms.Component catalogue — shared/worldgen/componentCatalog.jsonH3M — Portals repository, branch claude/project-thread-fehq3v, commit 0bbb769e74 · 2026-11-011,576 catalogue entries from all 120 display rooms (1,562 distinct component ids: a few are shared between rooms): 574 lighting, 358 architecture, 231 decor, 154 display, 83 backdrop, 77 sculpture, 68 furniture and 31 textile. Names, roles and sizes in metres are the catalogue’s. It is generated from the room files and grows as rooms are built: it held 593 from 48 rooms on 2026-09-28 and 1,567 from 120 on 2026-09-29.
Drawn: the supper club’s own parts sheet and render
04/05
A critic model scores each render against its prompt, clause by clause, and the room is revised. Its critiques became 45 rules; 31 check a plan in about 9 ms, before anything renders.The art-direction formula — docs/art-direction/FORMULA.md and shared/worldgen/artDirection.tsH3M — Portals repository, branch 2026-09-15-text-to-world, commit 171379c00a · 2026-09-2845 rules distilled from 59 critic reports on the display rooms. 31 are gates over a set’s plan that answer in about 9 ms, without rendering. The rules are a floor drawn from what the critic rejected, not a guarantee of a passing score, and one reader labelled the reports.
Drawn: an invented example; the counts are the page’s own
05/05
What’s kept is a recipe of a few hundred bytes, rebuilt at any of five levels of detail.Spoken worlds: a sentence painted with the app’s own brushes, then edited in words — shared/worldgen/stage.ts, stageGarden.ts and src/features/studio-rebuild/worlds/worldPainter.tsH3M — Portals repository, branch 2026-09-15-text-to-world, commits 63f3a53896, b98188e71c and 93828a8b5d · 2026-09-28Text becomes a recipe of a few hundred bytes (403 after seven edits), the recipe a plan, and the plan a lit scene at any of five levels of detail; each edit’s report is a diff of two plans. Built and reviewed in the browser harness on 2026-09-27 and 28. The same plan now runs inside the app’s Composer (see the entry on Text to World in the app).
Drawn: an invented recipe and world; the size is the page’s own
Inside the system
Every room is made of parts.
Component breakdown
One supper club, thirteen parts.
Every piece the prompt names is a component: sized, measured against its declared size, and placed by the room’s own build.
The harness’s components view of the room, each part on a studio floor, with its entrance view inset.Display-room review renders and the worlds showcase — scripts/showcase_shots.py and harness/world/showcase.htmlH3M — Portals repository, branch 2026-09-15-text-to-world, commit 3ae5994410 · 2026-09-29The harness’s own renders, drawn in the browser: each room’s entrance view from its newest review sheet, and its components view, every component on a studio floor, measured against its declared size. The lettering in the rooms is the harness’s placeholder house name. The ten rooms shown are from the review sheets of 2026-09-29; by 2026-10-02 the harness held renders of all 120 rooms.
1
Curved channel-stitched banquette
Furniture, 2.7 m across: burgundy velvet, channel-stitched, as the prompt asks.Component catalogue — shared/worldgen/componentCatalog.jsonH3M — Portals repository, branch claude/project-thread-fehq3v, commit 0bbb769e74 · 2026-11-011,576 catalogue entries from all 120 display rooms (1,562 distinct component ids: a few are shared between rooms): 574 lighting, 358 architecture, 231 decor, 154 display, 83 backdrop, 77 sculpture, 68 furniture and 31 textile. Names, roles and sizes in metres are the catalogue’s. It is generated from the room files and grows as rooms are built: it held 593 from 48 rooms on 2026-09-28 and 1,567 from 120 on 2026-09-29.
2
Oversized pleated drum pendant
Decor: a low pendant with a warm, pleated silk shade, hung over the table.
3
Etched smoked-mirror oval
The logo slot: lettering etched into smoked mirror above the banquette.
4
The room, assembled
The same parts, placed. Its light became a named look any set can take: a low tinted fill and a flagged neutral key.Looks: light and grade as data — shared/worldgen/looks.tsH3M — Portals repository, branch 2026-09-15-text-to-world, commit 171379c00a · 2026-09-2816 looks. 10 are transcribed from the display rooms’ own light rigs, each checked against the room file it cites; the Oxblood Supper Club’s is “low tinted fill, one flagged neutral key”. 6 are authored for spoken worlds and not yet rendered.
Component breakdown
Ten parts, three of them light.
The sun, the product’s key light and the water’s ripples are catalogued like the parasol and the pool.
The harness’s components view of the room, each part on a studio floor, with its entrance view inset.Display-room review renders and the worlds showcase — scripts/showcase_shots.py and harness/world/showcase.htmlH3M — Portals repository, branch 2026-09-15-text-to-world, commit 3ae5994410 · 2026-09-29The harness’s own renders, drawn in the browser: each room’s entrance view from its newest review sheet, and its components view, every component on a studio floor, measured against its declared size. The lettering in the rooms is the harness’s placeholder house name. The ten rooms shown are from the review sheets of 2026-09-29; by 2026-10-02 the harness held renders of all 120 rooms.
1
Oversized striped parasol segment
Decor, 1.8 m wide, cantilevered from the wall: its broad shadow does the work of furniture.Component catalogue — shared/worldgen/componentCatalog.jsonH3M — Portals repository, branch claude/project-thread-fehq3v, commit 0bbb769e74 · 2026-11-011,576 catalogue entries from all 120 display rooms (1,562 distinct component ids: a few are shared between rooms): 574 lighting, 358 architecture, 231 decor, 154 display, 83 backdrop, 77 sculpture, 68 furniture and 31 textile. Names, roles and sizes in metres are the catalogue’s. It is generated from the room files and grows as rooms are built: it held 593 from 48 rooms on 2026-09-28 and 1,567 from 120 on 2026-09-29.
2
Diving-board shelf
The display: the product on a short board over the apparent pool.
3
Tiled pool edge
Architecture with a glossy water inset: the pool is scenery, so the room stays dry.
4
The room, assembled
Its build places the same ten parts, the lights among them.Component catalogue — shared/worldgen/componentCatalog.jsonH3M — Portals repository, branch claude/project-thread-fehq3v, commit 0bbb769e74 · 2026-11-011,576 catalogue entries from all 120 display rooms (1,562 distinct component ids: a few are shared between rooms): 574 lighting, 358 architecture, 231 decor, 154 display, 83 backdrop, 77 sculpture, 68 furniture and 31 textile. Names, roles and sizes in metres are the catalogue’s. It is generated from the room files and grows as rooms are built: it held 593 from 48 rooms on 2026-09-28 and 1,567 from 120 on 2026-09-29.
Component breakdown
A finish line any world can borrow.
Built for one sport, catalogued like every room, and ready for any world that names it.
The harness’s components view of the room, each part on a studio floor, with its entrance view inset.Display-room review renders and the worlds showcase — scripts/showcase_shots.py and harness/world/showcase.htmlH3M — Portals repository, branch 2026-09-15-text-to-world, commit 3ae5994410 · 2026-09-29The harness’s own renders, drawn in the browser: each room’s entrance view from its newest review sheet, and its components view, every component on a studio floor, measured against its declared size. The lettering in the rooms is the harness’s placeholder house name. The ten rooms shown are from the review sheets of 2026-09-29; by 2026-10-02 the harness held renders of all 120 rooms.
1
Oversized sunrise disc
A backdrop, 2 m across, rising where the road meets the horizon.Component catalogue — shared/worldgen/componentCatalog.jsonH3M — Portals repository, branch claude/project-thread-fehq3v, commit 0bbb769e74 · 2026-11-011,576 catalogue entries from all 120 display rooms (1,562 distinct component ids: a few are shared between rooms): 574 lighting, 358 architecture, 231 decor, 154 display, 83 backdrop, 77 sculpture, 68 furniture and 31 textile. Names, roles and sizes in metres are the catalogue’s. It is generated from the room files and grows as rooms are built: it held 593 from 48 rooms on 2026-09-28 and 1,567 from 120 on 2026-09-29.
2
Race finish gantry
The logo slot: a solid header over the finish, never on the ribbon.
3
Forced-perspective city street
Architecture that rises toward the horizon, to fake a much longer road.
4
The room, assembled
Say “finish line” in a spoken world, and up to two of these pieces come with it: the tape, the street, the gantry.Room words become pieces in any world — shared/worldgen/roomWords.ts and roomPieces.tsH3M — Portals repository, branch 2026-09-15-text-to-world, commit e5f65df43c · 2026-09-28A room’s own words bring up to two of its signature pieces into a spoken world, never its lights, floors or shells. The Last Mile at Sunrise’s are its finish tape, street and gantry. Placement is still rough; placing pieces by the formula’s set grammar is next.
Text to world
Say a place. Then say the hour and the weather.
A sentence names one of 100 miniature low-poly scenes. Its hour, its weather and the things it names reach the scene.
Four sentences, and what the browser harness made of each. The scenes are premade packs by other artists, shown here for illustration on a non-commercial site.Low-poly worlds from a sentence: the casual pack taken apart into library assets and recipes — commit 86667c53bb, and the sentence fixes after itH3M — Portals repository, branch claude/project-thread-fehq3v, commits 86667c53bb (2026-10-28), 013e3dcb59, e0c55bd964 and 24d8b27bd8 (2026-10-29) and 396290dcbf (2026-11-01); renders from the harness’s aaa-lowpoly page · 2026-11-01100 premade miniature scenes, made by other artists and supplied to the project: they are not H3M’s work, and are shown here for illustration, with Ryan’s go-ahead, on a non-commercial site. Taken apart into 6,311 objects, 4,531 de-duplicated assets and 212 categories, each tagged, and kept as recipes; every placement was rebuilt from its source and checked, 6,311 of 6,311 within 0.5% of the object’s size. A low-poly sentence builds, remixes and mixes them; its hour, weather and named things reach the scene, rain and snow fall on it, and a thing added stands clear, dry and in front. The four pictures are the browser harness’s own renders of 2026-10-29, one seed, none edited. In the app the scenes load from a cloud bucket, each piece fetched the first time it is used (commit 396290dcbf); not yet released.
1
“a pirate lagoon at golden hour”
One of 100 miniature scenes, kept as recipes of 4,531 tagged assets: a sentence builds, remixes and mixes them.Low-poly worlds from a sentence: the casual pack taken apart into library assets and recipes — commit 86667c53bb, and the sentence fixes after itH3M — Portals repository, branch claude/project-thread-fehq3v, commits 86667c53bb (2026-10-28), 013e3dcb59, e0c55bd964 and 24d8b27bd8 (2026-10-29) and 396290dcbf (2026-11-01); renders from the harness’s aaa-lowpoly page · 2026-11-01100 premade miniature scenes, made by other artists and supplied to the project: they are not H3M’s work, and are shown here for illustration, with Ryan’s go-ahead, on a non-commercial site. Taken apart into 6,311 objects, 4,531 de-duplicated assets and 212 categories, each tagged, and kept as recipes; every placement was rebuilt from its source and checked, 6,311 of 6,311 within 0.5% of the object’s size. A low-poly sentence builds, remixes and mixes them; its hour, weather and named things reach the scene, rain and snow fall on it, and a thing added stands clear, dry and in front. The four pictures are the browser harness’s own renders of 2026-10-29, one seed, none edited. In the app the scenes load from a cloud bucket, each piece fetched the first time it is used (commit 396290dcbf); not yet released.
2
“in a rainstorm”
Rain and snow said of a scene fall on it.Low-poly worlds from a sentence: the casual pack taken apart into library assets and recipes — commit 86667c53bb, and the sentence fixes after itH3M — Portals repository, branch claude/project-thread-fehq3v, commits 86667c53bb (2026-10-28), 013e3dcb59, e0c55bd964 and 24d8b27bd8 (2026-10-29) and 396290dcbf (2026-11-01); renders from the harness’s aaa-lowpoly page · 2026-11-01100 premade miniature scenes, made by other artists and supplied to the project: they are not H3M’s work, and are shown here for illustration, with Ryan’s go-ahead, on a non-commercial site. Taken apart into 6,311 objects, 4,531 de-duplicated assets and 212 categories, each tagged, and kept as recipes; every placement was rebuilt from its source and checked, 6,311 of 6,311 within 0.5% of the object’s size. A low-poly sentence builds, remixes and mixes them; its hour, weather and named things reach the scene, rain and snow fall on it, and a thing added stands clear, dry and in front. The four pictures are the browser harness’s own renders of 2026-10-29, one seed, none edited. In the app the scenes load from a cloud bucket, each piece fetched the first time it is used (commit 396290dcbf); not yet released.
3
“with falling snow”
The snow falls, and the ground goes white.Low-poly worlds from a sentence: the casual pack taken apart into library assets and recipes — commit 86667c53bb, and the sentence fixes after itH3M — Portals repository, branch claude/project-thread-fehq3v, commits 86667c53bb (2026-10-28), 013e3dcb59, e0c55bd964 and 24d8b27bd8 (2026-10-29) and 396290dcbf (2026-11-01); renders from the harness’s aaa-lowpoly page · 2026-11-01100 premade miniature scenes, made by other artists and supplied to the project: they are not H3M’s work, and are shown here for illustration, with Ryan’s go-ahead, on a non-commercial site. Taken apart into 6,311 objects, 4,531 de-duplicated assets and 212 categories, each tagged, and kept as recipes; every placement was rebuilt from its source and checked, 6,311 of 6,311 within 0.5% of the object’s size. A low-poly sentence builds, remixes and mixes them; its hour, weather and named things reach the scene, rain and snow fall on it, and a thing added stands clear, dry and in front. The four pictures are the browser harness’s own renders of 2026-10-29, one seed, none edited. In the app the scenes load from a cloud bucket, each piece fetched the first time it is used (commit 396290dcbf); not yet released.
4
“at night”
Night stays readable: the light never blows out or goes black.Low-poly worlds from a sentence: the casual pack taken apart into library assets and recipes — commit 86667c53bb, and the sentence fixes after itH3M — Portals repository, branch claude/project-thread-fehq3v, commits 86667c53bb (2026-10-28), 013e3dcb59, e0c55bd964 and 24d8b27bd8 (2026-10-29) and 396290dcbf (2026-11-01); renders from the harness’s aaa-lowpoly page · 2026-11-01100 premade miniature scenes, made by other artists and supplied to the project: they are not H3M’s work, and are shown here for illustration, with Ryan’s go-ahead, on a non-commercial site. Taken apart into 6,311 objects, 4,531 de-duplicated assets and 212 categories, each tagged, and kept as recipes; every placement was rebuilt from its source and checked, 6,311 of 6,311 within 0.5% of the object’s size. A low-poly sentence builds, remixes and mixes them; its hour, weather and named things reach the scene, rain and snow fall on it, and a thing added stands clear, dry and in front. The four pictures are the browser harness’s own renders of 2026-10-29, one seed, none edited. In the app the scenes load from a cloud bucket, each piece fetched the first time it is used (commit 396290dcbf); not yet released.
5
Then: inside the app
The same plan now runs in the Portals app’s Composer: a spoken world is placed in AR as one item, and its pieces can be selected, moved, turned, resized and deleted.Text to World in the Portals app — rail tool, prompt tray, 120-room strip and world nodeH3M — Portals repository, Composer branch, commit 05ffa00951; merged into staging and main as 4.10.0 (80), commits 1857b6bcc7 and d10fa88ebc · 2026-11-01In the app’s Composer from 2026-10-14: a Text to World tool, a prompt tray, a strip of the 120 rooms, and a world placed in AR as one item whose pieces can be selected, moved, turned, resized and deleted (commits 9acb52cfa7 and 552540d1f3). First tried on a phone on 2026-10-14. Not yet released: the 4.10.0 (80) build was archived on 2026-11-01 and waits to go to TestFlight, and the phone checks of placing and reopening a world are still open.
Results
120Display-room prompts 01–120 and the sentence router — shared/worldgen/roomPrompts.ts and roomRouter.tsH3M — Portals repository, branch 2026-09-15-text-to-world, commit e5f65df43c · 2026-09-28Ryan’s prompts, in four series of thirty (01–30, juxtaposition 31–60, sport 61–90 and franchise 91–120). Each line quoted on the page is a phrase from these prompts in his wording; three (rooms 03, 10 and 19) are trimmed from longer sentences. The file is unchanged since 2026-09-28. A sentence opens a prebuilt room only when it names one; otherwise it composes a world.Scene prompts, written in four series.
1,576Component catalogue — shared/worldgen/componentCatalog.jsonH3M — Portals repository, branch claude/project-thread-fehq3v, commit 0bbb769e74 · 2026-11-011,576 catalogue entries from all 120 display rooms (1,562 distinct component ids: a few are shared between rooms): 574 lighting, 358 architecture, 231 decor, 154 display, 83 backdrop, 77 sculpture, 68 furniture and 31 textile. Names, roles and sizes in metres are the catalogue’s. It is generated from the room files and grows as rooms are built: it held 593 from 48 rooms on 2026-09-28 and 1,567 from 120 on 2026-09-29.Reusable components, catalogued from 120 rooms.
45The art-direction formula — docs/art-direction/FORMULA.md and shared/worldgen/artDirection.tsH3M — Portals repository, branch 2026-09-15-text-to-world, commit 171379c00a · 2026-09-2845 rules distilled from 59 critic reports on the display rooms. 31 are gates over a set’s plan that answer in about 9 ms, without rendering. The rules are a floor drawn from what the critic rejected, not a guarantee of a passing score, and one reader labelled the reports.Art-direction rules, distilled from 59 critiques.
16Looks: light and grade as data — shared/worldgen/looks.tsH3M — Portals repository, branch 2026-09-15-text-to-world, commit 171379c00a · 2026-09-2816 looks. 10 are transcribed from the display rooms’ own light rigs, each checked against the room file it cites; the Oxblood Supper Club’s is “low tinted fill, one flagged neutral key”. 6 are authored for spoken worlds and not yet rendered.Looks: light and grade as data, ten taken from the rooms.
The catalogue, by roleComponent catalogue — shared/worldgen/componentCatalog.jsonH3M — Portals repository, branch claude/project-thread-fehq3v, commit 0bbb769e74 · 2026-11-011,576 catalogue entries from all 120 display rooms (1,562 distinct component ids: a few are shared between rooms): 574 lighting, 358 architecture, 231 decor, 154 display, 83 backdrop, 77 sculpture, 68 furniture and 31 textile. Names, roles and sizes in metres are the catalogue’s. It is generated from the room files and grows as rooms are built: it held 593 from 48 rooms on 2026-09-28 and 1,567 from 120 on 2026-09-29.
Lighting36%574
Architecture23%358
Decor15%231
Display10%154
Backdrop5%83
Sculpture5%77
Furniture4%68
Textile2%31
All 1,576 components by what they do. Lights are the largest share: a room’s light rig is made of parts too.
Carried forward
Every room teaches the library, and every sentence can draw on it.
Credits
001Ryan BrantConcept, briefs, art direction, and system design