SkymapGen is a desktop tool for generating and previewing equirectangular 360 sky maps from text prompts. It combines a Tauri/Vite/Three.js interface with a Python Diffusers generation pipeline, so generated panoramas can be viewed immediately inside an interactive sphere.
## Features
- Generate equirectangular PNG sky maps from text prompts.
- Preview maps in a full-screen Three.js 360 viewer with orbit controls.
- Keep a thumbnail dock of generated maps from the local `output/` folder.
- Persist generation settings in the app, including size, steps, guidance, scheduler, model paths, upscaling, and seam inpainting.
- Cancel an active generation from the UI.
- Store the enriched prompt in PNG metadata for later display.
- Write generation logs to `logs/`.
## Requirements
- macOS, Linux, or Windows with Tauri prerequisites installed.
- Node.js and npm.
- Rust and Cargo for the Tauri desktop shell.
- Python 3.10 recommended. `run.sh` prefers `python3.10` when available and falls back to `python3`.
- Enough RAM/VRAM for SDXL generation. Apple Silicon MPS and CUDA are detected automatically when available.
Python dependencies are listed in `requirements.txt`. JavaScript dependencies are listed in `package.json`.
## Model Files
The app is offline-first by default. It will use local files or cached Hugging Face assets unless downloads are explicitly enabled.
Recommended local files:
-`models/sdxl360Diffusion_v10.safetensors` for the SDXL 360 checkpoint.
-`RealESRGAN_x4plus.pth` in the project root if you enable Real-ESRGAN upscaling.
If the SDXL 360 checkpoint is missing, the generator can load `ProGamerGov/sdxl-360-diffusion` from the Hugging Face cache, or download it when downloads are enabled.
## Quick Start
```bash
./run.sh
```
The script will:
1. Create `.venv/` if needed.
2. Install Python requirements.
3. Install npm dependencies if `node_modules/` is missing.
4. Start the Tauri dev app with `npm run tauri dev`.
To allow missing Hugging Face assets to download during startup or generation:
```bash
SKYMAP_ALLOW_DOWNLOADS=1 ./run.sh
```
## Manual Setup
```bash
python3.10 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
npm install
```
Start the desktop app:
```bash
npm run tauri dev
```
Build the web assets only:
```bash
npm run build
```
Build a Tauri app bundle:
```bash
npm run tauri build
```
## Desktop Usage
1. Launch the app.
2. Enter a prompt in the bottom prompt bar.
3. Open `Settings` to adjust generation parameters.
4. Click `Generate`.
5. The generated panorama is saved to `output/` and loaded into the 360 viewer.
During generation, the `Generate` button changes to `Cancel`. Existing PNG maps in `output/` are shown in the thumbnail dock, and can be selected or deleted from the app.
Default desktop generation settings:
- Size: `1536x768`
- Steps: `25`
- Guidance: `6.5`
- Scheduler: `dpmsolver-sde`
- Upscale: `none`
- Seam inpainting: disabled
- Model: local `models/sdxl360Diffusion_v10.safetensors` when present, otherwise `ProGamerGov/sdxl-360-diffusion`
- Base model: `stabilityai/stable-diffusion-xl-base-1.0`
- VAE: `madebyollin/sdxl-vae-fp16-fix`
## CLI Usage
You can run the Python generator directly:
```bash
source .venv/bin/activate
python generate_equirect.py \
--prompt "wide alpine meadow at sunset" \
--output-dir output \
--width 1536 \
--height 768 \
--steps 25 \
--guidance 6.5 \
--scheduler dpmsolver-sde \
--upscale none
```
Useful options:
-`--output PATH`: write to a specific PNG path.
-`--output-dir DIR`: choose the output directory when `--output` is not set.
-`--model-path VALUE`: use a Hugging Face model id or local model path.
-`--base-model VALUE`: SDXL base pipeline used when the 360 model only provides a UNet.
-`--vae-model VALUE`: VAE repo/path for SDXL models.
-`--scheduler euler|euler_a|heun|ddim|dpmsolver|dpmsolver-sde`: override the scheduler.
-`--upscale none|realesrgan|topaz`: post-process with no upscaler, Real-ESRGAN, or Topaz Photo AI.
-`--seam-inpaint`: shift and inpaint the wrap seam before saving.
-`--allow-downloads`: allow missing model files to be downloaded.
The generator automatically appends `, equirectangular 360 view` to prompts that do not already include that suffix.
## Outputs
- Generated PNGs are saved in `output/`.
- Log files from desktop generations are saved in `logs/`.
- PNG metadata includes a `prompt` text field containing the enriched prompt.
- Temporary generation folders are created under the project root and cleaned up by the generator.
Generated outputs, model weights, local caches, virtual environments, and build artifacts are ignored by Git.
## Troubleshooting
If model loading fails in offline mode, either place the required files locally, warm the Hugging Face cache, or rerun with:
```bash
SKYMAP_ALLOW_DOWNLOADS=1 ./run.sh
```
If Real-ESRGAN upscaling fails, make sure `RealESRGAN_x4plus.pth` exists in the project root and the Python requirements are installed.
If generation is slow or memory constrained, reduce `width`, `height`, or `steps`, disable seam inpainting, and keep upscaling off.
## Project Layout
```text
.
├── generate_equirect.py # Diffusers generation and post-processing CLI
├── run.sh # One-command development launcher
├── src/ # Vite/Three.js frontend
├── src-tauri/ # Tauri Rust desktop backend
├── configs/ # SDXL single-file loading config
├── public/ # Static frontend assets
├── models/ # Local model weights, ignored by Git
├── output/ # Generated PNG maps, ignored by Git
└── logs/ # Desktop generation logs, ignored by Git