跪拜 Guibai
← Back to the summary

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

While organizing my photo album in my spare time, I came across travel photos from the past. Over four thousand of them, and not a single one had ever been shared.

It's not that I didn't want to. I just didn't know how—a nine-grid collage felt too casual, a long image too ceremonious, and posting a single photo felt like something was missing. Those photos just lay in the album, sinking deeper year by year.

Image

So I started writing TripStamp. The idea was simple: pick a travel photo, pair it with a location, date, and a color extracted from the image, and turn it into a card.

Halfway through, I realized that what really took time wasn't building features—it was deciding what not to build.

No Account System

In the earliest version, I planned to do cloud sync. When users switch phones, their creations could follow them. It sounded reasonable. Later, I scrapped the idea.

Image

Having an account means needing a server. A server means storing user data. Storing data means writing a privacy policy about "how we use your information"—when the sentence I really wanted to write was: I can't get anything from you.

Now TripStamp has no registration, no login, no backend. Your photos are selected from your album, processed on your phone, and exported to your album. They never pass through any machine of mine. The line in the privacy policy that says "your photos or card copies will not be retained on the developer's servers" exists because there simply are no such servers.

Image

The trade-off is that data doesn't follow you when you switch phones. I accept that.

No Location Permission

Version 1.2.0 added "Travel Footprints": the places you've exported automatically connect into a map, and you can even switch to a 3D globe to spin it around.

For a map feature, the most natural approach is to request location permission. I didn't.

Image

Every point on the footprint map comes from information already present in the photo you selected. The latitude and longitude recorded by the camera when the photo was taken—the app reads that, nothing more. Photos you haven't selected, the app can't see. If you don't export, no point lands on the map.

So TripStamp's permission list has no "Location" entry. People opening the map for the first time often think a prompt was missed—it wasn't. It's genuinely not needed.

The flip side: if your photo lacks geolocation data, it simply can't appear on the map. I didn't use IP guessing or any other method to fill it in. If it's not there, it's not there.

No Server-Side Rendering

Later, I researched similar approaches and found that some apps handle "3D flight videos" like this: you upload the material, the server queues up rendering, and when it's your turn, you get a push notification. A screenshot I saw read "Current queue position: 516."

Image

I couldn't take that path—not for technical reasons, but because it directly conflicts with the two decisions above. Uploading material means I'd have to collect your photos first.

So the 3D globe renders in real-time on your phone. Rotation, zooming, route animations—all computed on the spot. No waiting, no internet required. You can spin it on a plane.

No Subscription

Pro is a one-time purchase.

I have too many monthly-charging apps on my own phone. Every time I see the bill, I wonder, "Am I still using this?" TripStamp is a low-frequency tool—you won't make cards every day. Maybe a few per trip, then not open it for months. A monthly charge doesn't suit this kind of thing.

Image

The free tier gives you four templates and five exports per day. A one-time purchase unlocks unlimited exports, removes the watermark, adds a passport stamp template, and enables route animations on the globe.

An Unexpected Problem: A Flat Map Can't Fit the Earth

This was the most surprising thing in the entire development process.

Image

I initially used a standard flat map for the footprint map. During testing, all the data was in the Yangtze River Delta, and everything worked fine. Until I created a set of cross-continental test data—Lisbon, Reykjavik, Kyoto—the map framed straight to the Arctic Ocean, and not a single marker was visible.

I thought the framing algorithm was wrong and revised it five times. Later, I realized: this is a limitation of the Mercator projection itself. The range of longitudes a portrait viewport can display under this projection is even less than a wide landscape viewport. When locations span a large distance, a flat map mathematically cannot contain them. It has nothing to do with the algorithm.

Image

So what's the solution? A sphere doesn't have this problem.

That's why the 3D globe wasn't added for show—it was because the flat map genuinely couldn't fit. I wrote this conclusion into the design document to prevent myself from trying to fix that framing algorithm again later.

A Blunder: Storage Ballooned 9x

After launch, I used it myself for a while and one day saw in Settings that the app's data occupied 51.2MB. Fifty-three memories, averaging 1MB each—thumbnails shouldn't be that large.

Image

Investigation revealed it was the default behavior of UIGraphicsImageRenderer: it renders at the screen's scale factor, which is 3x on iPhones. I had written "longest side 512px," but what was actually saved was 1536px. The pixel count was 9 times the expectation, so storage ballooned 9x along with it.

One line—format.scale = 1—fixed it. I also wrote a one-time migration to compress the oversized images already stored for existing users. On my device, it dropped from 51.2MB to 12.6MB.

Image

Interestingly, after the fix, I noticed the work previews became blurry. That "accidental 3x" had made the preview images just sharp enough for full-screen viewing. Fixing it made them insufficient. So the final approach was: set separate size limits for thumbnails and work previews. 512 is enough for the list; previews meant for full-screen get 1280.

One bug led to two decisions. That's probably just the daily routine of writing code.


TripStamp is now on the App Store. Search the name to find it. Version 1.2.0 is the Travel Footprints release.

Image

If you also have thousands of unshared travel photos lying in your phone, give it a try.

♥️ If you like my content, feel free to like, forward, and follow.

♥️ Focused on sharing content that integrates technology, investment, and cognition.

Recommended from previous issues:

860 Impressions, 13 Downloads: My First Overseas App's First Month Live

Bookmarks No Longer Gathering Dust: I Built a Second Brain That Organizes Itself Using Claude Code + Obsidian

Identifying "Fake Moats": 3 Signals to See Through Whether a Company Relies on Tech or Brand

Using AI to Self-Build a Program, I Found an AI Investment Tool and Deployed It Immediately—AI-Assisted Investing Became Real

Today's Reading Share—How to Do Great Work?

A Panoramic Map of Naval Ravikant's Thoughts—A Guide to Wealth and Happiness

How to Get Out of a Creative Slump? A Visual Guide to Cheer You On

How the Economic Machine Works?

The Only Way to Solve AI Anxiety, Recommended to Bookmark

In the AI Industrial Revolution, What Abilities Are Most Scarce? Why Do Many Entrepreneurs Make Products Nobody Buys? — Thoughts on Reading "The Mom Test" What Buffett and Munger Didn't Say Munger's Life Operating System, the Cornerstone for Building a Compounding Life How to Choose a Career That Truly Suits You? Decision Matrix Second-Order Thinking Decision Journal A Panoramic View of Essential Concepts for Software Engineers in the AI Era

Comments

Top 1 of 2 from juejin.cn, machine-translated. The original thread is authoritative.

誉纬

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.