MCPcopy
hub / github.com/yousifamanuel/terraink

github.com/yousifamanuel/terraink @v0.4.0 sqlite

repository ↗ · DeepWiki ↗ · release v0.4.0 ↗
396 symbols 828 edges 120 files 1 documented · 0%
README

TerraInk

Website Badge Email Badge LinkedIn Badge Instagram YouTube Threads Reddit TikTok Product Hunt

Bun Badge Vite Badge React Badge JavaScript Badge TypeScript Badge OpenStreetMap Badge MapLibre Badge GitHub Badge Cloudflare Badge Docker Badge

Note: TerraInk is still in development. Every feedback is appreciated. This is a for-fun, open-source project, and community contributions are very welcome.

Acknowledgment

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.

Features

  • 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

Data Providers and Mapping Stack

User Interface

Showcase

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

Featured Examples

Featured showcase example 1 Featured showcase example 2

Run

bun install
bun run dev

Environment

Check .env.example for available variables. They are optional for most local work and should not be set during testing unless a specific case requires them.

Build

bun run build

Deploy with Docker (Self-Hosting)

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

Contributing

The contribution guidelines are meant to keep TerraInk easy to extend, review, and maintain over time. They are here to support a durable architecture, not to add unnecessary friction.

Read CONTRIBUTING.md before opening a PR.

  • Branch from dev and target dev only. Do not open PRs against main.
  • Fill out the pull request template completely when you open a PR.
  • Keep contributions clean, modular, and aligned with the existing architecture.
  • Avoid hard-coded values when constants, configuration, or reusable abstractions are more appropriate.
  • AI-assisted coding is allowed, but submissions must be reviewed, refined, and intentionally engineered before review.

Star History

Star History Chart

License

This project is licensed under the MIT License - see the LICENSE file for details.

Trademark

The Terraink™ name, logo, and branding assets are trademarks of the project owner.

The MIT license grants you the right to use the code, but it does not grant any rights to use the project's name or branding for your own commercial purposes or hosted services.

See TRADEMARK.md for details.

Extension points exported contracts — how you extend this code

ImportMetaEnv (Interface)
(no doc)
src/types/env.d.ts
AppProvidersProps (Interface)
(no doc)
src/core/AppProviders.tsx
Layout (Interface)
(no doc)
src/features/layout/domain/types.ts
LocationParts (Interface)
(no doc)
src/shared/utils/location.ts
ImportMeta (Interface)
(no doc)
src/types/env.d.ts
FontOption (Interface)
(no doc)
src/core/config.ts
LayoutGroup (Interface)
(no doc)
src/features/layout/domain/types.ts
RGB (Interface)
(no doc)
src/shared/utils/color.ts

Core symbols most depended-on inside this repo

clamp
called by 30
src/shared/geo/math.ts
createSvgIcon
called by 18
src/features/markers/infrastructure/iconRegistry.ts
normalizeHexColor
called by 18
src/shared/utils/color.ts
resolveByCandidates
called by 15
src/features/theme/infrastructure/themeRepository.ts
widthExpr
called by 15
src/features/map/infrastructure/maplibreStyle.ts
compensateLineWidthStops
called by 15
src/features/map/infrastructure/maplibreStyle.ts
lineClassFilter
called by 15
src/features/map/infrastructure/maplibreStyle.ts
getThemeColorByPath
called by 12
src/features/theme/domain/colorPaths.ts

Shape

Function 299
Interface 83
Method 14

Languages

TypeScript100%

Modules by API surface

src/shared/utils/color.ts16 symbols
src/features/updates/ui/AnnouncementModal.tsx16 symbols
src/features/markers/ui/MarkerOverlay.tsx12 symbols
src/features/map/ui/MapSettingsSection.tsx12 symbols
src/features/map/ui/MapDimensionFields.tsx10 symbols
src/features/theme/infrastructure/themeRepository.ts9 symbols
src/features/install/application/useInstallPrompt.ts9 symbols
src/features/location/ui/StartupLocationModal.tsx8 symbols
src/shared/hooks/useRepoStars.ts7 symbols
src/features/poster/ui/SettingsPanel.tsx7 symbols
src/features/markers/ui/MarkersSection.tsx7 symbols
src/features/map/infrastructure/maplibreStyle.ts7 symbols

Dependencies from manifests, versioned

@fontsource/bebas-neue5.2.7 · 1×
@fontsource/lato5.2.7 · 1×
@fontsource/merriweather5.2.11 · 1×
@fontsource/noto-sans-jp5.2.9 · 1×
@fontsource/oswald5.2.8 · 1×
@fontsource/playfair-display5.2.8 · 1×
@fontsource/raleway5.2.8 · 1×
@fontsource/source-sans-pro5.2.5 · 1×
@types/react19.2.14 · 1×
@types/react-dom19.2.3 · 1×
@vitejs/plugin-react4.4.1 · 1×

For agents

$ claude mcp add terraink \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact