Skip to content

rstephens1/terraink

 
 

Repository files navigation

TerraInk

Bun Badge Vite Badge React Badge JavaScript Badge TypeScript Badge OpenStreetMap Badge License

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.

Aknowledgment

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.

User Interface

Showcase

All showcase images are stored in public/assets/screenshots/.

Featured Examples

Featured showcase example 1 Featured showcase example 2

Run

bun install
bun run dev

Environment

Configure these values in .env (see .env.example):

  • VITE_REPO_URL: Repository link shown in the sidebar
  • VITE_REPO_API_URL: GitHub API endpoint used to fetch star count
  • VITE_CONTACT_EMAIL: Contact email shown in the footer (mailto: link)
  • VITE_LEGAL_NOTICE_URL: Imprint/legal notice page URL
  • VITE_PRIVACY_URL: Data privacy page URL

Build

bun run build

Deploy with Docker

1) Build and run with Docker Compose

Create .env from .env.example (or set APP_PORT directly in your shell), then run:

docker compose up -d --build

This 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 --build

2) Stop the deployment

docker compose down

3) Optional: build and run without Compose

docker build -t terraink:latest .
docker run -d --name terraink -p 7200:80 --restart unless-stopped terraink:latest

Features

  • 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

Contributing

Contributions are welcome.

Please follow this flow:

  1. Pick an existing issue, or open a new issue first to discuss the bug/feature.
  2. Implement the fix/feature in a focused change.
  3. Open a pull request after the work is complete.
  4. Run tests/checks before opening the PR (bun run build at minimum) and verify everything works.
  5. 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.

About

TerraInk: The Cartographic Poster Engine that creates unique and customizable map posters

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • JavaScript 80.2%
  • CSS 19.4%
  • Other 0.4%