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.
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:
The three browser tools live at domeforge.org. The GIMP script runs on your machine. Midjourney makes the images.
Quick start
The short version, start to finish. Each step links to its full section below.
- Set the geometry. Open Geometry Lab, leave it at 8 panels, note the
--arit shows (16:9). details ↓ - Export the parameters. Open Alignment Grid, confirm 8 panels, click for GIMP to download
dome-params.scm. details ↓ - Render 10 images in Midjourney: 8 wall panels at
--ar 16:9, onecap, onenadir, all sharing one light and time of day. details ↓ - Fit the walls in GIMP. Install the script, run Filters → Dome Forge → Fit dome panels. details ↓
- Walk inside. Open Dome Viewer, load the
fittedfolder plus cap and nadir, press I. details ↓
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.
--ar changes with it — always read it off the tool.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).
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.
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.
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
Panel01.png…Panel08.png, plus one with cap and one with nadir in the name. Avoid "cap" in the folder name — it confuses the detector.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:
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:
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.png…panel-08.png plus cap.png into fitted/.
dome-fit.scm.You can also run it from the console for a single panel — see GIMP commands.
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.
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:
(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:
(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:
(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:
(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-dome-fit "/Users/David/Desktop/CapeCanav"
8 1.778 0.32 0.0833 2048 2048 0.14 96 FALSE)
Check the version
(car (gimp-version))
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.
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
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.
Deploy the site
The browser tools are static single-file HTML on Cloudflare Pages. From the site folder:
npx wrangler login npx wrangler pages project create domeforge --production-branch main npx wrangler pages deploy . --project-name domeforge
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.
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.