Google Earth for game developers.
Click anywhere on the map. Get a game-ready 3D mesh in 20 seconds. Real terrain, real buildings, real textures.
Draw a box on the map, download a .zip with:
- Terrain mesh (30m resolution elevation from Mapbox)
- Buildings (from OpenStreetMap, extruded to real heights)
- Satellite texture mapped on the terrain
- 1:1 scale (1 unit = 1 meter)
- Go to localhost:3000
- Shift+drag to select an area (1-5km works best)
- Pick quality level (Low to Ultra)
- Hit generate
- Drag the .obj into Unity/Unreal/Blender
Takes 30-120 seconds depending on area size.
- Async Generation: Heavy mesh processing runs in background threads.
- Job Persistence: Progress stored in Redis (1h expiry).
- Rate Limiting: 5 requests/minute per IP (exempt on localhost).
- Monitoring: Prometheus metrics at
backend:8000/metrics. - Structured Logging: JSON logs for easy tracking.
- Frontend: Next.js + Tailwind CSS + Leaflet
- Backend: FastAPI + Redis + Trimesh + Prometheus
- Data: Mapbox Terrain-RGB (elevation), OSM Overpass (buildings), Mapbox Static (satellite)
You need:
- Python 3.13+
- Node.js 18+
- Redis (for job persistence)
- Mapbox API token (free tier at https://account.mapbox.com/access-tokens/)
Backend:
cd backend
./setup.sh
# ensure redis-server is running
# add MAPBOX_ACCESS_TOKEN to .env
uv run uvicorn app.main:app --reload # runs on :8000Frontend:
cd frontend
npm install
npm run dev # runs on :3000Open localhost:3000, shift+drag on the map, hit generate.
See backend/README.md and frontend/README.md for detailed sub-system documentation.
- Extract the .zip
- Drag .obj into Unity Assets
- Done (textures load automatically, scale is 1:1)
See docs/unity.md for details.
- Min: 1km ร 1km (smaller = weird terrain stretching)
- Sweet spot: 2km ร 2km
- Max: 5km ร 5km (bigger = timeout/OOM)