Documentation

From flat render
to a dome you can
walk inside.

Dome Forge turns eight flat images plus a sky and a floor into a stitched, explorable environment. This is the whole process — geometry, alignment, rendering, fitting, viewing — with every command ready to copy.

overview

What it is

A flat picture doesn't sit right on a curved wall — the edges look wrong when you stand in the middle. Dome Forge solves that with a ring of panels, each geometrically corrected, plus a polar-wrapped sky cap and a floor. The result is a space you move through, not a picture you look at.

There are four browser tools and one GIMP script:

toolGeometry Lab toolAlignment Grid renderMidjourney scriptGIMP fit toolDome Viewer

The three browser tools live at domeforge.org. The GIMP script runs on your machine. Midjourney makes the images.

onboarding · first dome

Quick start

The short version, start to finish. Each step links to its full section below.

  1. Set the geometry. Open Geometry Lab, leave it at 8 panels, note the --ar it shows (16:9). details ↓
  2. Export the parameters. Open Alignment Grid, confirm 8 panels, click for GIMP to download dome-params.scm. details ↓
  3. Render 10 images in Midjourney: 8 wall panels at --ar 16:9, one cap, one nadir, all sharing one light and time of day. details ↓
  4. Fit the walls in GIMP. Install the script, run Filters → Dome Forge → Fit dome panels. details ↓
  5. Walk inside. Open Dome Viewer, load the fitted folder plus cap and nadir, press I. details ↓
The walls need GIMP's geometric warp. The cap and nadir don't — the viewer wraps them live, so they go straight in unfitted.
step 1 · geometry lab

Set the dome's shape

Everything downstream depends on the panel count and the aspect ratio it implies. More panels means each render covers a narrower arc, so less edge distortion — but more images to make.

  • 8 panels — the default. Each wall renders at 16:9, 8.1% edge stretch. A good balance.
  • 12 panels — 3.4% stretch, flatter, but twelve renders to keep consistent.
  • 6 panels — 15.6% stretch, only six images, but visible curvature.

Walk inside (press I) to feel the curve before committing. The number that matters for rendering is the --ar the panel shows — that's the aspect ratio every wall render must use.

At 8 panels and wall height 5.3m the aspect lands exactly 16:9. If you change panel count or wall height, the --ar changes with it — always read it off the tool.
step 2 · alignment grid

Export the parameters

The Alignment Grid shows where the panel rulings must fall on the curved surface (amber) versus where a flat render puts them (blue). The pre-warp slider bends one to meet the other. You don't have to understand the grid to use it — the important action is the export.

Set the panel count to match your renders, then click for GIMP. It downloads dome-params.scm — the file the GIMP script reads for the warp curve, panel count, aspect, and horizon. Put it next to the script (see step 4).

The exported panel count must match what you actually render. An 8-panel export against 12 renders warps everything wrong.
step 3 · midjourney

Render the images

You need 8 wall panels, 1 cap (sky, straight up), and 1 nadir (ground, straight down). The walls wrap 360° around the viewer, so they have to agree on one horizon height, one light direction, one time of day — or the seams show.

Wall panels

Render each at the --ar from step 1. Give every wall an identical style suffix so they stitch. The scene is split by compass bearing — decide what sits at each of the eight directions around the viewer.

The cap

Straight up. Either a uniform sky (use the viewer's flat cap mode) or a radially-composed zenith shot (use polar mode). Uniform is more forgiving.

midjourney · cap
pre-dawn indigo sky directly overhead, deepest blue at center fading toward edges, faint scatter of stars, wisps of high cloud, no horizon, seamless radial composition, muted desaturated palette, subtle film grain, photorealistic --ar 1:1 --style raw

The nadir (floor)

Straight down. The viewer lays this flat, so it wants uniform ground — calm water works beautifully — with no strong directional feature or central void.

midjourney · nadir
directly overhead aerial view straight down at perfectly calm dark water, smooth still black water filling the entire frame edge to edge, uniform gentle ripples, no shoreline, no horizon, no central feature, evenly textured, faint pre-dawn blue reflection, deep indigo tone, seamless and radially uniform, photorealistic, seen from directly above --ar 1:1 --style raw
Name files so they sort right: Panel01.pngPanel08.png, plus one with cap and one with nadir in the name. Avoid "cap" in the folder name — it confuses the detector.
step 4 · gimp fit

Fit the walls in GIMP

Only the walls get fitted — the cap and nadir skip GIMP entirely. Requires GIMP 3.0+ (the script refuses 2.10).

Install

Find your scripts folder — GIMP tells you under Edit → Preferences → Folders → Scripts. On macOS it's usually:

bash · install
cp ~/Downloads/dome-fit.scm ~/Downloads/dome-params.scm \
   ~/Library/Application\ Support/GIMP/3.2/scripts/

Both files go in the same folder. Restart GIMP or run Filters → Script-Fu → Refresh Scripts.

Prepare the output folder

Script-Fu can't make folders, so create the output folder by hand first:

bash · setup
mkdir -p ~/Desktop/CapeCanav/fitted

Run it

Filters → Dome Forge → Fit dome panels. Point Folder of renders at your image folder, leave Burn grid on unchecked for clean output, click OK. It writes panel-01.pngpanel-08.png plus cap.png into fitted/.

If your folder name contains "cap" (like "CapeCanav"), the current script handles it — but older copies classified every file as the cap. Make sure you're on the current dome-fit.scm.

You can also run it from the console for a single panel — see GIMP commands.

step 5 · dome viewer

Walk inside

Open the viewer. Load your images three ways — drag the folder onto the drop zone, click folder…, or files…. It sorts them into 8 walls, cap, and nadir automatically.

Move around

  • I — step inside / out
  • W A S D — walk · drag — look · Q E — up/down · shift — faster

If WASD does nothing, click once on the 3D area first so keyboard focus leaves the sliders.

Arrange the panels

Filename order isn't always right. Fix it in-viewer:

  • Drag a slot onto another to swap.
  • Click one slot, then another, to move it.
  • Right-click a slot to load a fresh image into it.

Cap & floor

Both wrap live. If the cap shows a sunburst at the zenith, switch it to flat mode. Use rotation to line the sky and ground up with the walls. See viewer controls.

alt path · one image → whole dome

Panorama → dome

Instead of eight separate wall renders, generate one cohesive scene — a single 2:1 equirectangular panorama holding the whole environment — and slice it into the dome. Because every panel is a cut from the same image, all seven internal seams are continuous by construction. You go from eight problem-seams to one.

1 · Generate the panorama

Use an image model with a real API and wide-format support — Nano Banana 2 (Gemini 3.1 Flash Image) does native ultra-wide and 4K. Prompt for a true equirectangular at 2:1. The words that matter: equirectangular projection, seamless 360 wraparound, 2:1 aspect ratio.

prompt · mars equirect
Equirectangular 360 degree panorama, full spherical VR panorama, Mars surface at golden hour, rust-orange rocky plain with scattered boulders and dust dunes to a distant crater rim, butterscotch sky graduating from pale peach at the horizon to dusty salmon overhead, small hazy sun low on the horizon, thin dusty atmosphere, soft long shadows, photorealistic, seamless 360 wraparound, equirectangular projection, 2:1 aspect ratio, muted desaturated palette --ar 2:1

Swap the subject for other worlds — Saturn's rings overhead, an undersea trench, a predawn lagoon — keeping the equirectangular / 2:1 / seamless keywords fixed.

2 · Slice it in GIMP

Install dome-slice.scm alongside the other scripts, create the output folder, then run Filters → Dome Forge → Slice panorama. It cuts the panorama into 8 warped wall panels plus a cap and nadir extracted from the poles.

bash · setup
cp ~/Downloads/dome-slice.scm ~/Library/Application\ Support/GIMP/3.2/scripts/
mkdir -p ~/Desktop/Mars/sliced

3 · The fallback: walls only

The poles are the weak point — diffusion models rarely produce a true equirectangular, so the cap and nadir pulled from the top and bottom bands may look stretched. The slicer has a Walls only (skip poles) toggle for exactly this: take the eight continuous wall panels from the panorama, and supply your own cap and nadir renders the normal way. Often the sweet spot — maximum cohesion where it works, no fighting the pole projection.

The one seam a panorama can't guarantee is the wrap seam (panel 8 → panel 1), where the image's left edge meets its right. If it shows, close it with the viewer's retouch brush — built for exactly this.

The fallback ladder

Nothing here replaces the working eight-panel path — it sits on top of it. If the panorama disappoints, step down: walls-only panorama with your own poles; then a plain ultra-wide (8:1) instead of true equirectangular; then hand-finish with the retouch brush; and underneath it all, the eight-independent-panel pipeline that always works. You can't get stuck.

reference · gimp console

GIMP commands

Open Filters → Script-Fu → Console. Paste one line at a time (start at the (, end at the final ) — don't include the terminal prompt).

Reload the script without restarting

After editing dome-fit.scm, force a fresh load:

script-fu · reload
(load "/Users/David/Library/Application Support/GIMP/3.2/scripts/dome-fit.scm")

Load the parameters

If dome-warp-curve is unbound, load the params file first:

script-fu · params
(load "/Users/David/Library/Application Support/GIMP/3.2/scripts/dome-params.scm")

Fit one wall panel

Re-process a single re-rolled render without redoing all eight:

script-fu · one wall
(dome-fit-wall "/Users/David/Desktop/CapeCanav/Panel03.png"
               "/Users/David/Desktop/CapeCanav/fitted/panel-03.png"
               3 2048 1.778 0.32 0.0833
               dome-warp-curve dome-warp-samples 96 12 8 FALSE)

Arguments: in-path, out-path, index, width, aspect, horizon-frac, overlap-frac, curve, samples, strips, cells-x, cells-y, burn-grid. Set the last to TRUE to overlay the diagnostic grid.

Fit the cap plate

The cap doesn't need this (the viewer wraps it), but the script can square-crop and flip it if you want a baked plate:

script-fu · cap
(dome-fit-cap "/Users/David/Desktop/CapeCanav/Cap.png"
              "/Users/David/Desktop/CapeCanav/fitted/cap.png"
              2048 0.14 FALSE)

Run the whole batch

script-fu · batch
(script-fu-dome-fit "/Users/David/Desktop/CapeCanav"
                    8 1.778 0.32 0.0833 2048 2048 0.14 96 FALSE)

Slice a panorama

Cut one equirectangular into the dome set. Last arg TRUE = walls only (skip poles).

script-fu · slice
(script-fu-dome-slice "/Users/David/Desktop/Mars/mars-pano.png"
                      "/Users/David/Desktop/Mars/sliced"
                      8 0.0833 0.5 0.25 0.25 2048 1152 2048 96 FALSE)

Check the version

script-fu · version
(car (gimp-version))
reference · viewer

Viewer controls

Source toggle

fitted shows your GIMP-warped panels (warp off — already baked). raw shows unfitted renders with the warp applied live in-shader. Flip between them to compare, or to skin a dome from raw renders without GIMP.

Geometry

Load dome-params.scm or set panels, radius, wall height, cap rise, eye height, and overlap by hand. Changing panel count adopts the slot layout.

Cap

  • polar / flat — polar wraps a radial zenith render; flat lays a uniform sky flat (no sunburst).
  • dead zone — polar only; hides the smeared center.
  • rotation — spin to align with walls.

Nadir

Always flat-mapped. rotation and scale tune how the ground texture sits; the rim fades into the wall bases.

Seams & checks

  • present / register / build — clean, edge-tinted, or grid-overlaid display.
  • highlight seams, tuck & cross-fade, reference grid, wireframe.
  • seam fade width — how softly panels blend at the tuck.

Mode

build shows all instruments. user hides the chrome for a clean walk-through and drops you inside.

reference · prompts

Prompt recipes

The rule that makes walls stitch: one shared style suffix on every wall, locking horizon height, sky gradient, time of day, and light direction. Only the foreground subject changes per bearing.

Shared wall suffix

midjourney · suffix
pre-dawn blue hour, low flat horizon at one third height, cold indigo sky graduating to faint teal near the horizon, still calm water with soft reflections, wisps of ground mist, no sun visible, muted desaturated palette, subtle film grain, photorealistic wide-angle landscape photography, no people, no text --ar 16:9 --style raw

Prepend a per-panel foreground clause (what sits at that bearing) before the suffix. Keep the suffix identical across all eight.

Seam continuity lives at the vertical edges: the right edge of each panel must match the left edge of the next. If a form is cut off with nothing continuing it on the neighbor, that's a re-roll — blending can't invent the missing half.
reference · deploy

Deploy the site

The browser tools are static single-file HTML on Cloudflare Pages. From the site folder:

bash · first time
npx wrangler login
npx wrangler pages project create domeforge --production-branch main
npx wrangler pages deploy . --project-name domeforge
bash · redeploy
npx wrangler pages deploy . --project-name domeforge

The custom domain is attached in the dashboard: Workers & Pages → domeforge → Custom domains. The stable URL is domeforge.pages.dev; each deploy also gets a preview-prefixed URL.

reference · troubleshooting

When something breaks

GIMP: “string-length: argument 1 must be: string”

Usually a stale script or the folder-name-contains-"cap" issue. Reload the script fresh (see above), and make sure you're on the current dome-fit.scm.

GIMP: script changes don't take effect

Refresh Scripts often isn't enough for structural edits. Fully quit GIMP (Cmd+Q) and relaunch, or (load "…/dome-fit.scm") in the console to force it.

Viewer: cap has a sunburst at the top

That's polar wrapping collapsing to the center point. Switch the cap to flat mode.

Viewer: nadir looks like a pinwheel

Older versions polar-wrapped the floor. Current builds lay it flat — reload the page. If it persists, the render has a strong central feature; re-roll with a uniform ground.

Viewer: WASD doesn't move me

Keyboard focus is on a slider. Click once on the 3D area, then use the keys.

Viewer: clicking a panel to swap does nothing

Fixed in current builds (draggable elements were swallowing clicks). Reload the page to get the latest.