A premium, open-source desktop application for generating beautiful city map posters. Built with Wails (Go + React) for a lightweight, native Windows experience.
Made with ❤️ by msamuslim101
- Global Coverage: Generate high-resolution map posters for any city in the world
- 10 Premium Themes: Noir, Blueprint, Sunset, Midnight Blue, Ocean, Forest, Terracotta, Copper, Japanese Ink, Neon Cyberpunk
- Customizable Overlays: Toggle city name, country name, and coordinates
- Adjustable Map Radius: 5km - 30km for perfect framing
- Multiple Print Sizes: 18×24", 24×36", 12×16", A3, A2
- Portrait & Landscape: Orientation support
- Native Experience: Lightweight (~15MB app), Low RAM (~80MB idle)
- Download the latest release from Releases
- Extract the ZIP file
- Run
MapToPoster.exe
Folder Structure (Required):
MapToPoster/
├── MapToPoster.exe ← Run this!
└── python/
└── server.exe ← Backend (DO NOT DELETE)
⚠️ Important: Keep both files together. The app won't work withoutpython/server.exe.
The codebase includes an experimental legacy mode for Windows 7 (MTP_LEGACY_WIN7=1), but it is not currently functional as a Win7 build. Building a true Win7-compatible binary requires Go 1.20.x and Python 3.8.x, which are not used in the current release.
The legacy mode code remains in the codebase harmlessly — it only activates when the environment variable is explicitly set, and has zero effect on the normal Win10/11 app.
- Windows 10/11 (64-bit)
- ~200MB disk space
- Internet connection (for downloading map data)
Q: Does the app need to be in the same folder as create_map_poster.py?
A: If you are using the Bundled Release (the ZIP from the Releases page), No. The app is "Plug & Play" and handles all internal script management for you. If you are a developer running from Source Code, the app expects the backend scripts to be in the backend/ folder relative to the executable.
Q: Why does the first generation take so long? A: The first time you generate a map for a new city, the engine must download several megabytes of OpenStreetMap data and cache it locally. Subsequent generations for the same city will be significantly faster.
Q: Is it safe to delete the python/ folder?
A: No. The MapToPoster.exe is a frontend wrapper; it requires the python/server.exe sidecar found in that folder to perform the actual map rendering.
This project is a desktop GUI wrapper for originalankur/maptoposter.
| Aspect | Detail |
|---|---|
| Core Engine | originalankur/maptoposter |
| Snapshot Version | January 18, 2026 |
| What I Added | Windows desktop GUI, React UI, FastAPI server wrapper, one-click installer |
| License | MIT (same as original) |
💡 All map generation logic belongs to the original project. I only added the GUI wrapper and bundling.
- Custom city display name (
--nameparameter support) - Dynamic font sizing for long city names
- Custom color picker for themes
- Live preview while adjusting settings
- Map drag-to-pan for precise positioning
- Zoom controls on map preview
- Progress bar during generation
- History/Gallery of generated posters
- Aspect ratio options (Instagram Stories 9:16, A4 print, etc.)
- Batch generation (multiple cities at once)
- Vector export (SVG/PDF) for print shops
- Custom text labels (beyond city/country name)
- Water-only mode (for coastal cities)
- Road hierarchy customization
- Cache management (clear/view cached cities)
- New themes from upstream
- macOS support (Wails supports it!)
- Linux support
This repository includes a dormant legacy runtime mode (MTP_LEGACY_WIN7=1) and wails-app/scripts/start-legacy-win7.bat. This feature is not actively maintained and cannot be built with the current toolchain.
⚠️ Why this doesn't work yet: Go 1.21+ and Python 3.9+ dropped Windows 7 support. The current project uses Go 1.25 and Python 3.14, so binaries produced will not run on Win7. Building a functional Win7 version requires installing Go 1.20.x and Python 3.8.x in a separate environment. Microsoft also ended WebView2 support for Win7 in late 2022.
The code is kept in the codebase as it has zero impact on the main Win10/11 app — it only activates when MTP_LEGACY_WIN7=1 is explicitly set.
- Go 1.21+ (download)
- Node.js 18+ (download)
- Python 3.11+ (download) (dev/build only; end users do NOT need Python if
python/server.exeis bundled) - Wails CLI:
go install github.com/wailsapp/wails/v2/cmd/wails@latest
# 1. Clone the repo
git clone https://github.com/msamuslim101/maptopostergui.git
cd MapToPoster
# 2. Build Python backend
cd backend
python -m venv .venv
.\.venv\Scripts\activate
pip install -r requirements.txt
pyinstaller server.spec
Copy-Item "dist\server.exe" "..\wails-app\python\server.exe"
# 3. Run in dev mode
cd ..\wails-app
wails devcd wails-app
wails build
# Output: build/bin/MapToPoster.exe
# Copy python/server.exe to build/bin/python/server.exeMapToPoster/
├── wails-app/ # 🚀 Wails Desktop App
│ ├── app.go # Core App Config & Lifecycle
│ ├── window_manager.go # Native window controls & Save Dialogs
│ ├── python_manager.go # Python sidecar active-process isolation
│ ├── frontend/ # React UI (TypeScript + Context API + Tailwind)
│ │ └── src/
│ │ ├── App.tsx # Root compose container
│ │ ├── components/ # Modular UI (TopBar, Canvas, Sidebars, Modals)
│ │ └── context/ # Global robust AppContext state
│ └── python/ # Bundled static server.exe
├── backend/ # 🐍 Python FastAPI server
│ ├── server.py # REST API routing
│ ├── models.py # Pydantic request/response models
│ ├── tasks.py # Map generation isolated background threads
│ ├── store.py # Cross-request job state dictionary
│ └── server.spec # PyInstaller config
├── maptoposter-main/ # ⚙️ Core engine (osmnx + matplotlib)
└── assets/ # 📸 Screenshots and media
Tech Stack:
- Frontend: React 18 + TypeScript + Tailwind CSS
- Desktop: Wails v2 (Go + WebView2)
- Backend: FastAPI + OSMnx + Matplotlib
- Bundling: PyInstaller (Python) + Wails CLI (Go)
| Data Type | Location |
|---|---|
| Generated Posters | Temporary folder (until you save) |
| OSMnx Map Cache | %LOCALAPPDATA%\osmnx\ |
| App Settings | Not yet implemented |
💡 Tip: The OSMnx cache persists between sessions. Generating the same city again will be much faster!
- Schema warning in IDE (
Unable to load schema from wails.io) - Safe to ignore, doesn't affect builds - First-time generation for a new city takes 30-60 seconds (downloading map data)
MIT License - Free for personal and commercial use.
| Component | Author | License |
|---|---|---|
| Core Map Engine | Ankur Gupta | MIT |
| Desktop GUI Wrapper | msamuslim101 | MIT |
See LICENSE for full text.
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repo
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Publish a ZIP with this structure:
MapToPoster/
├── MapToPoster.exe
├── python/
│ └── server.exe
└── scripts/
└── start-legacy-win7.bat
This gives users one-click normal launch (MapToPoster.exe) and one-click Win7-compatible launch (scripts/start-legacy-win7.bat).
