跪拜 Guibai
← All articles
iOS · AI Programming · Product

TripStamp: An iOS Travel Card App Built on What It Refuses to Do

By FIRE_Lee ·
Read original on juejin.cn ↗ Google Translate ↗ Alt translation

TripStamp demonstrates that a privacy-respecting, fully on-device architecture is viable for a consumer iOS app in 2025, and that deliberate feature refusal can be a stronger product differentiator than feature accumulation. The Mercator projection limitation and the 9x storage bug are concrete, reusable lessons for any mobile developer working with maps or image rendering.

Summary

TripStamp is a new iOS app that converts travel photos into shareable cards by extracting embedded location data and dominant colors. The app deliberately avoids account systems, cloud sync, and server-side processing: photos never leave the device, and the privacy policy can honestly state that no user data is ever collected because no backend exists. A footprint map stitches exported locations together using only the GPS metadata already inside selected photos, sidestepping any need for location permissions.

Version 1.2.0 adds a 3D globe rendered in real-time on-device, a feature born from a practical dead end. A flat Mercator map in portrait orientation mathematically cannot frame widely dispersed locations like Lisbon and Kyoto simultaneously, so the globe became the only viable container. The monetization model is a one-time purchase, not a subscription, matching the app's low-frequency usage pattern.

Development wasn't without stumbles. A `UIGraphicsImageRenderer` default rendered thumbnails at 3x screen scale, inflating storage 9x until a single `format.scale = 1` line and a migration script brought 51.2MB down to 12.6MB. Fixing that then revealed previews were too blurry for full-screen, leading to separate size caps for list thumbnails and detail views.

Takeaways
TripStamp has no account system, no backend, and no cloud sync; all photo processing and card generation happens locally on the device.
The app never requests location permissions because it reads GPS coordinates already embedded in photos by the camera at capture time.
A 3D globe replaced the flat map because Mercator projection in a portrait viewport cannot frame widely dispersed global locations simultaneously.
Monetization uses a one-time purchase, not a subscription, since the app is used infrequently—a few times per trip, then dormant for months.
`UIGraphicsImageRenderer` defaults to the device's screen scale (3x on iPhone), causing thumbnails to render at 9x the expected pixel count and balloon storage.
Setting `format.scale = 1` fixed the storage bloat, but then required separate resolution caps for list thumbnails (512px) and full-screen previews (1280px).
A one-time migration script compressed already-stored oversized images for existing users, reducing app data from 51.2MB to 12.6MB on the developer's device.
Conclusions

Deliberately omitting features—accounts, cloud sync, location permissions—can produce a stronger privacy story and simpler architecture than adding them and then trying to mitigate their downsides.

The 3D globe wasn't a design flourish; it was the only solution to a mathematical limitation of Mercator projection in portrait mode, which is a constraint many map-using apps will eventually hit.

A single framework default (`UIGraphicsImageRenderer` scale) caused a 9x storage multiplier, and fixing it broke a downstream assumption about preview sharpness—illustrating how tightly coupled rendering and storage decisions are on mobile.

Concepts & terms
Mercator projection
A cylindrical map projection that preserves angles and shapes for navigation but severely distorts area and cannot display the full range of longitudes in a narrow portrait viewport when locations span continents.
UIGraphicsImageRenderer
An Apple UIKit class for rendering images into a graphics context. Its default behavior respects the device's screen scale factor (e.g., 3x on iPhone), which can unintentionally multiply output resolution and storage size.
From the discussion
Featured comments
誉纬

A one-time purchase is quite a bargain, but it also raises a worry—the software's survival problem.

FIRE_Lee

Indeed, it's tough to manage [facepalm] a labor of love.

See top comments, translated →
Source: juejin.cn ↗ Google Translate ↗ Backup ↗