
Boaz Sobrado built RunInk for exactly that, and it makes single-route posters too. RunInk answered our questions in writing, and he read and approved the piece.
The poster
He was running in Budapest, mostly the same loops along the Danube, with a few hundred runs on Strava, and the thing he wanted on the wall was not one race:
It was all of them: the shape of the city as I run it, the streets I’ve worn a groove into. Every poster service I found did one route, one page. Nobody did “every run I’ve done in this city as one picture”, so I built that first, and the single-route poster came along because a first marathon deserves its own wall too.
Getting a raw Strava route onto a wall takes “more than you’d expect,” he says. GPS jitter leaves a loop that starts and ends at the same tree with its start and finish markers “fighting over the same pixel”, so RunInk has to notice and merge the two labels. Web maps are built for navigation, with labels everywhere and roads in six colors, so each RunInk theme is “a full palette for the basemap, the route and the typography,” which keeps the route as the subject. The city posters bring their own trouble:
Hundreds of routes stacked at full opacity turn into a blob, so the layering has to be tuned, and if someone picks runs 300 km apart the “city” poster is mostly empty map, so the editor warns before compiling.

Designing one is free and doesn’t ask for a card. The free export is a preview for your phone and Instagram, sent by email with a small runink.app mark; the HD file for printing is $3.99 (£2.99 in the UK), and every print includes it. There are thirteen themes. RunInk’s guide says it sorts your history by where each run happened, so a city is one click even if you’ve lived in three. Around 30 runs in one city, it says, is where the layering starts to look intentional. Prints include shipping to the UK, the US, Canada, Australia and most of Europe, and UK orders are printed in the UK and priced in pounds. In dollars:
| Poster | Price, shipped | Size (US and Canada) |
|---|---|---|
| Small, matte | $32 | 30 × 40 cm (12 × 18 in) |
| Large, matte | $42 | 40 × 60 cm (18 × 24 in) |
| XL, matte | $49 | 50 × 70 cm (24 × 36 in) |
| XL, framed | $139 | 50 × 70 cm, black aluminium |
| XL, framed, US and Canada | $209 | 24 × 36 in, black aluminium |
It only reads from Strava, with no GPX upload and no Garmin sign-in. If your runs live in Garmin, MapMyTrails takes Garmin files and also plots every activity in a city. Cadence Prints will layer a whole year of runs into a heatmap on one sheet. Strava’s own personal heatmap is for subscribers and can’t be exported, only screenshotted. Prices, sizes and the fine print are on the RunInk listing, and the other poster makers are in our roundup of Strava art and print apps.
The build, in his words
This part is for anyone building on the Strava API, so it’s our questions and his answers, with a note from us where a source adds something.
What’s it built with, and what was the hardest technical problem?
The hardest problem by a mile was print-ready files. The preview lives on a phone screen at maybe 400 px wide; the print is a 50x70 cm file at 300 DPI. Every text size, line width and marker has to scale with the poster so what you see is what Gelato prints. And phone browsers cannot render that: iOS silently hands you a blank WebGL canvas when the texture gets too big, and I chased that bug through four “fixes” before moving all rendering to the server. Now a headless Chromium renders every poster from the same React page the editor uses, and the print resolution is carried by the device scale factor rather than a bigger viewport, which was the trick that made 300 DPI both fast and pixel-identical to the preview.
React 19 + TypeScript + Vite + Tailwind on the front, MapLibre GL with OpenFreeMap vector tiles for the map, Node 22 + Express + Postgres on the back, hosted on DigitalOcean App Platform, files on Cloudflare R2, Stripe for checkout, Gelato for printing. Most of the code was written with Claude Code, with me reviewing and testing on real phones.
The numbers behind the blank canvas: RunInk’s biggest metric poster at 300 DPI is 5,906 by 8,268 pixels, about 49 million, and the 24 by 36 inch US version is about 78 million. WebKit on iPhone capped a canvas at 4,096 by 4,096 pixels, about 17 million, until a 2024 change that a developer who tested it says reached phones in iOS 18. The cap is now about 67 million.
The device scale factor trick works because a browser lays out a page in CSS pixels. Raise the device scale factor in Puppeteer and the layout stays put while every CSS pixel is drawn with more real ones. One trap if you try it with MapLibre: its maxCanvasSize defaults to 4,096 pixels a side, and above that it lowers the pixel ratio instead of failing, so a print can come out soft with nothing but a one-time console warning.
On the Strava side, he added:
Strava rate limits were manageable; the Strava surprise was in-app browsers. A lot of traffic arrives from Instagram, and Instagram’s webview breaks the OAuth round trip in creative ways.
No webhooks, on purpose: RunInk caches activities in memory to render and never writes them to a database, and the privacy policy promises that.
Both are well documented. The OAuth standard for native apps, RFC 8252, says not to run sign-in inside embedded browsers, Google has blocked its own sign-in there since 2021, and Strava’s docs pass the consequence on: Google Sign-in won’t work in a mobile webview, so anyone who logs in to Strava with Google gets stuck. On storage, Strava’s API Policy lets apps cache data for up to seven days and bars keeping it longer (section 6.2). Nothing says the cache has to live in memory, so his version is stricter than the rule.
What would you tell someone about to build on the Strava API?
- Apply for API approval early. It took a while and the app was ready before Strava was.
- Design for the phone in an in-app browser, because that’s where your users actually are. Instagram and Facebook webviews are your real runtime, not Chrome on a laptop.
- Read the API agreement before you architect: what you may store, what you may show, what you may not compete with. I built around “cache, don’t persist” and it shaped everything.
- Ship the free thing first. Runners want to see their own data made beautiful; the print decision comes after that moment, not before.
- Test the whole pipeline on a real device you don’t own. Most of my worst bugs never appeared on my own phone.
On approval: you can build and test with up to 10 athletes before Strava reviews anything. A new app starts in what Strava calls Single Player Mode, just your own account, and you raise it to 10 yourself. Past 10 you need Strava’s review, which has no fixed turnaround, and new sign-ins wait until it passes. Since June 2026 you also need a Strava subscription to create an app. For the details, see our getting started guide and what changed for developers in 2026.
The business
RunInk prints through Gelato. He compared it with Printful, and local production decided it: a poster for someone in Denver is printed in the US, one for someone in Lisbon in Europe. “That’s what lets me include shipping in the price.” The catch is one every print-on-demand shop lives with:
Quality control is the honest downside of print on demand: I never touch the poster. So the file is the QC. Every deploy runs a real 300 DPI render in CI and checks the output, and the policy for a damaged or wrong print is a free reprint or full refund, no questions.
Including shipping means “the small poster is nearly a courtesy and the framed and XL sizes carry the business,” and he says that’s where the paid orders land. When he answered in September, what people used most was the free HD file, and he was fine with that, “because people design a poster of their own data and share it.” RunInk has since changed that: the free file is now a preview for your phone and Instagram with a small runink.app mark, and the HD file for printing is $3.99, or comes with any print. Gift codes came from the first real customer, who bought a framed poster for a friend and didn’t want to guess which run mattered. So a gift code lets the recipient connect their own Strava and design it themselves.

Strava approved RunInk’s public integration in April 2026, he says, and print ordering opened the same month. It’s one person plus “a few Claude agents”, early in its story, and the first printed posters have gone out to customers.
Sources
- Written answers from RunInk, September 2026
- RunInk, its price list and its city heatmap poster guide
- Strava API Policy (sections 3.6 and 6.2); Strava developer docs on rate limits and athlete capacity, getting started and authentication; An update to our developer program, June 1, 2026
- Strava Support: personal heatmaps
- RFC 8252, OAuth 2.0 for Native Apps (section 8.12) and Google on OAuth in embedded webviews
- WebKit bug 271002 (iOS canvas limit raised to 8192 by 8192), a developer’s test of the iOS 18 change, MapLibre GL JS map options and Puppeteer’s viewport options
- MapMyTrails FAQ and Cadence Prints FAQ