[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-74825":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":23,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":33,"readmeContent":34,"aiSummary":35,"trendingCount":16,"starSnapshotCount":16,"syncStatus":36,"lastSyncTime":37,"discoverSource":38},74825,"terraink","yousifamanuel\u002Fterraink","yousifamanuel","Terraink: The Cartographic Poster Engine that creates unique and customizable map posters","https:\u002F\u002Fterraink.app",null,"TypeScript",3255,355,19,49,0,30,70,200,90,109.65,"Other",false,"main",true,[27,28,29,30,5,31,32],"maps","openstreetmap","poster","reactjs","wallpaper","webapp","2026-06-12 04:01:16","![](.\u002Fpublic\u002Fassets\u002Fbanner.png)\n\n# Terraink\n\n[![Website Badge](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWebsite-fff?logo=appveyor&logoColor=000&style=for-the-badge)](https:\u002F\u002Fterraink.app)\n[![Email Badge](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FEmail-D14836?logo=gmail&logoColor=fff&style=for-the-badge)](mailto:hello@terraink.app)\n[![LinkedIn Badge](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLinkedIn-0A66C2?logo=linkedin&logoColor=fff&style=for-the-badge)](https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002Fterraink\u002F)\n[![Instagram](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FInstagram-E4405F?logo=instagram&logoColor=fff&style=for-the-badge)](https:\u002F\u002Finstagram.com\u002Fterraink.app)\n[![YouTube](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FYouTube-FF0000?logo=youtube&logoColor=fff&style=for-the-badge)](https:\u002F\u002Fwww.youtube.com\u002F@terrainkapp)\n[![Threads](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FThreads-000?logo=threads&logoColor=fff&style=for-the-badge)](https:\u002F\u002Fwww.threads.net\u002F@terraink.app)\n[![Reddit](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FReddit-FF4500?logo=reddit&logoColor=fff&style=for-the-badge)](https:\u002F\u002Fwww.reddit.com\u002Fr\u002Fterraink)\n[![TikTok](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTikTok-000?logo=tiktok&logoColor=fff&style=for-the-badge)](https:\u002F\u002Fwww.tiktok.com\u002F@terraink.app)\n[![Product Hunt](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FProduct%20Hunt-DA552F?logo=producthunt&logoColor=fff&style=for-the-badge)](https:\u002F\u002Fwww.producthunt.com\u002Fproducts\u002Fterraink)\n\n[![Bun Badge](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FBun-000?logo=bun&logoColor=fff&style=for-the-badge)](https:\u002F\u002Fbun.sh)\n[![Vite Badge](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FVite-9135FF?logo=vite&logoColor=fff&style=for-the-badge)](https:\u002F\u002Fvitejs.dev)\n[![React Badge](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FReact-61DAFB?logo=react&logoColor=000&style=for-the-badge)](https:\u002F\u002Freact.dev\u002F)\n[![JavaScript Badge](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FJavaScript-F7DF1E?logo=javascript&logoColor=000&style=for-the-badge)](https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FJavaScript)\n[![TypeScript Badge](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTypeScript-007ACC?logo=typescript&logoColor=fff&style=for-the-badge)](https:\u002F\u002Fwww.typescriptlang.org)\n[![OpenStreetMap Badge](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FOpenStreetMap-7EBC6F?logo=openstreetmap&logoColor=fff&style=for-the-badge)](https:\u002F\u002Fwww.openstreetmap.org)\n[![MapLibre Badge](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FMapLibre-000?logo=maplibre&logoColor=fff&style=for-the-badge)](https:\u002F\u002Fmaplibre.org\u002F)\n[![GitHub Badge](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGitHub-fff?logo=github&logoColor=000&style=for-the-badge)](https:\u002F\u002Fgithub.com\u002Fyousifamanuel\u002Fterraink)\n[![Cloudflare Badge](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FCloudflare-F38020?logo=cloudflare&logoColor=fff&style=for-the-badge)](https:\u002F\u002Fwww.cloudflare.com)\n[![Docker Badge](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FDocker-2496ED?logo=docker&logoColor=fff&style=for-the-badge)](https:\u002F\u002Fwww.docker.com)\n\n> Note: Terraink is still in development. Every feedback is appreciated. This is an open-source project, and community contributions are very welcome.\n\n> **License & Trademark Notice:** This project is licensed under AGPL-3.0 and includes trademark protections. See the [License](#license) and [Trademark](#trademark) sections for details.\n\n## Features\n\n- **Custom city map posters** for any location in the world, powered by real OpenStreetMap data\n- **Smart geocoding** — search for any city or region by name, or enter coordinates manually\n- **Rich theme system** — choose from dozens of curated themes or build your own custom color palette\n- **Detailed map layers** — roads, water bodies, parks, and building footprints with per-layer styling\n- **Typography controls** — set city\u002Fcountry display labels and load any Google Fonts family\n- **High-resolution PNG export** — download a print-ready poster at any defined dimension\n\n## Data Providers and Mapping Stack\n\n- **Map data**: [OpenStreetMap contributors](https:\u002F\u002Fwww.openstreetmap.org\u002Fcopyright)\n- **Tiles**: [OpenMapTiles](https:\u002F\u002Fopenmaptiles.org\u002F)\n- **Tile hosting**: [OpenFreeMap](https:\u002F\u002Fopenfreemap.org\u002F)\n- **Geocoding**: [Nominatim](https:\u002F\u002Fnominatim.openstreetmap.org\u002F)\n- **Map renderer**: [MapLibre](https:\u002F\u002Fmaplibre.org\u002F)\n\n## User Interface\n\n![Terraink web UI](.\u002Fdocs\u002Fimages\u002FWeb_UI.png)\n\n## Showcase\n\n### Featured Examples\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\".\u002Fdocs\u002Fimages\u002Fshowcase_1.png\" alt=\"Featured showcase example 1\" width=\"100%\" \u002F>\n  \u003Cimg src=\".\u002Fdocs\u002Fimages\u002Fshowcase_2.png\" alt=\"Featured showcase example 2\" width=\"100%\" \u002F>\n\u003C\u002Fp>\n\n## License\n\nAs of **April 3rd 2026**, all new changes to this repository are licensed under [AGPL-3.0](LICENSE). Code released before that date remains under the [MIT License](LICENSE-OLD).\n\nThe hosted Terraink service includes attribution and branding as part of the user interface.\n\nIf you deploy or modify the open-source version, you are responsible for complying with the AGPL-3.0 license, including preserving license and copyright notices.\n\nFor access to the hosted version with additional features and support, see Terraink Business or contact: [business@terraink.app](mailto:business@terraink.app).\n\n## Trademark\n\nTerraink™ is a trademark of Yousuf Amanuel. An application for registration has been filed with the German Patent and Trade Mark Office (DPMA). This filing establishes priority rights under the Paris Convention, allowing international trademark registration to be pursued within six months of the original filing date. The Terraink logo, visual identity, and branding assets are copyright © 2026 Yousuf Amanuel. All rights reserved.\n\nUnauthorized use of the Terraink name in connection with similar software, map services, or related commercial products may be restricted. For licensing inquiries, contact [business@terraink.app](mailto:business@terraink.app).\n\nSee [TRADEMARK.md](.\u002FTRADEMARK.md) for details.\n\n## Run\n\n```bash\nbun install\nbun run dev\n```\n\n## Environment\n\nCheck [`.env.example`](.\u002F.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.\n\n## Build\n\n```bash\nbun run build\n```\n\n## Deploy with Docker (Self-Hosting)\n\n### 1) Build and run with Docker Compose\n\nCreate `.env` from `.env.example` (or set `APP_PORT` directly in your shell), then run:\n\n```bash\ndocker compose up -d --build\n```\n\nThis serves the app on `http:\u002F\u002Flocalhost:7200` by default.\n\nTo change the exposed host port:\n\n- Linux\u002FmacOS:\n\n```bash\nAPP_PORT=80 docker compose up -d --build\n```\n\n- PowerShell:\n\n```powershell\n$env:APP_PORT=80\ndocker compose up -d --build\n```\n\n### 2) Stop the deployment\n\n```bash\ndocker compose down\n```\n\n### 3) Optional: build and run without Compose\n\n```bash\ndocker build -t terraink:latest .\ndocker run -d --name terraink -p 7200:80 --restart unless-stopped terraink:latest\n```\n\n## Contributing\n\n> 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.\n\nRead [CONTRIBUTING.md](.\u002FCONTRIBUTING.md) before opening a PR.\n\n- Branch from `dev` and target `dev` only. Do not open PRs against `main`.\n- Fill out the pull request template completely when you open a PR.\n- Keep contributions clean, modular, and aligned with the existing architecture.\n- Avoid hard-coded values when constants, configuration, or reusable abstractions are more appropriate.\n- AI-assisted coding is allowed, but submissions must be reviewed, refined, and intentionally engineered before review.\n\n## Attribution\n\n- **Map data**: © [OpenStreetMap contributors](https:\u002F\u002Fwww.openstreetmap.org\u002Fcopyright), licensed under [ODbL](https:\u002F\u002Fopendatacommons.org\u002Flicenses\u002Fodbl\u002F)\n- **Tile schema**: © [OpenMapTiles](https:\u002F\u002Fopenmaptiles.org\u002F), licensed under [ODbL](https:\u002F\u002Fopenmaptiles.org\u002Fdocs\u002Ftileset\u002Fopenmaptiles\u002F)\n- **Tile hosting**: [OpenFreeMap](https:\u002F\u002Fopenfreemap.org\u002F)\n- **Geocoding**: [Nominatim](https:\u002F\u002Fnominatim.openstreetmap.org\u002F) \u002F OpenStreetMap data\n- **Map renderer**: [MapLibre GL JS](https:\u002F\u002Fmaplibre.org\u002F), licensed under [BSD-3-Clause](https:\u002F\u002Fgithub.com\u002Fmaplibre\u002Fmaplibre-gl-js\u002Fblob\u002Fmain\u002FLICENSE.txt)\n\n## Acknowledgment\n\nTerraink was inspired by [MapToPoster](https:\u002F\u002Fgithub.com\u002Foriginalankur\u002Fmaptoposter) by [Ankur Gupta](https:\u002F\u002Fgithub.com\u002Foriginalankur), originally released under the MIT license. Terraink is an independent reimplementation built from scratch using Bun, React, and TypeScript, and has since evolved significantly beyond the original concept.\n\n## Star History\n\n[![Star History Chart](https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=yousifamanuel\u002Fterraink&type=Date)](https:\u002F\u002Fstar-history.com\u002F#yousifamanuel\u002Fterraink&Date)\n","Terraink 是一个用于创建独特且可定制的地图海报的制图引擎。它利用 OpenStreetMap 数据，结合 React 和 TypeScript 技术栈开发而成，支持用户自定义地图样式、添加个性化元素，并能生成高质量的壁纸或打印用海报。项目采用 Vite 构建工具提升开发效率，并通过 MapLibre 实现地图渲染。适合需要为特定地点设计纪念品、装饰品或进行地理信息可视化展示的个人和企业使用。",2,"2026-06-11 03:50:59","high_star"]