TerraInk: The Cartographic Poster Engine
App link: https://terraink.app
Note: TerraInk is still in development. I appreciate every feedback. 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 for accurate and detailed maps.
All showcase images are stored in public/assets/screenshots/.
bun install
bun run devConfigure these values in .env (see .env.example):
VITE_REPO_URL: Repository link shown in the sidebarVITE_REPO_API_URL: GitHub API endpoint used to fetch star countVITE_CONTACT_EMAIL: Contact email shown in the footer (mailto:link)VITE_LEGAL_NOTICE_URL: Imprint/legal notice page URLVITE_PRIVACY_URL: Data privacy page URL
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:latest- City + country geocoding via Nominatim (or manual lat/lon override)
- OpenStreetMap feature loading via Overpass API
- Theme system with customizable colors and styles
- Roads, water, parks, and building footprint rendering
- Typography controls for display labels and optional Google Font family
- PNG export
Contributions are welcome.
Please follow this flow:
- Pick an existing issue, or open a new issue first to discuss the bug/feature.
- Implement the fix/feature in a focused change.
- Open a pull request after the work is complete.
- Run tests/checks before opening the PR (
bun run buildat minimum) and verify everything works. - If possible, add a small screenshot for UI updates.
Code quality expectations:
- Keep code clean, readable, and reusable.
- If something is used in multiple places, extract it into a shared component.
- Reuse existing components when they already cover the use case.
- Prefer short, focused functions over long functions.
- Compose small functions/components through clear abstractions and interfaces.
- Follow naming conventions consistently.
- Add concise comments where the intent is not obvious.



