Note: TerraInk is still in development. Every feedback is appreciated. This is a for-fun, open-source project, and community contributions are very welcome.
This project is a JavaScript reimplementation inspired by the original MapToPoster originalankur/maptoposter by Ankur Gupta (MIT license). My app is built using Bun, React, and TypeScript. It allows users to create custom city map posters with various styling options, leveraging OpenStreetMap data rendered via MapLibre and OpenFreeMap vector tiles.
- Custom city map posters for any location in the world, powered by real OpenStreetMap data
- Smart geocoding — search for any city or region by name, or enter coordinates manually
- Rich theme system — choose from dozens of curated themes or build your own custom color palette
- Detailed map layers — roads, water bodies, parks, and building footprints with per-layer styling
- Typography controls — set city/country display labels and load any Google Fonts family
- High-resolution PNG export — download a print-ready poster at any defined dimension
- Map data: OpenStreetMap contributors
- Tiles: OpenMapTiles
- Tile hosting: OpenFreeMap
- Geocoding: Nominatim
- Map renderer: MapLibre
All showcase images are stored in public/assets/showcase/.
bun install
bun run devCopy .env.example to .env and fill in your values. See CONTRIBUTING.md for a description of each variable.
bun run buildCreate .env from .env.example (or set APP_PORT directly in your shell), then run:
docker compose up -d --buildThis serves the app on http://localhost:7200 by default.
To change the exposed host port:
- Linux/macOS:
APP_PORT=80 docker compose up -d --build- PowerShell:
$env:APP_PORT=80
docker compose up -d --builddocker compose downdocker build -t terraink:latest .
docker run -d --name terraink -p 7200:80 --restart unless-stopped terraink:latestSee CONTRIBUTING.md for setup instructions, environment variables, branch strategy, and contribution guidelines.