All work

Graffiti

A social travel app for saving the places you visit to a map, grouping them into collections, and sharing them with others.

A hand holding an iPhone showing a feed of saved Spots in Graffiti, starting with The Water Temple

Overview

The best spots from a trip tend to end up as unlabeled photos in a camera roll. Graffiti turns them into places on a map, with as little manual entry as possible.

Travelers save Spots, each with photos, a description, an address, and hashtags, and group them into Walls: collections of places worth remembering or recommending. Around that sits a social layer of follows, likes, comments, and discovery of nearby and trending places.

Built between 2018 and 2020, it shipped on the App Store as Graffiti – Social Location, with a TypeScript Cloud Functions backend and a React web companion.

What it does

Spots and Walls

  • Multi-photo Spots with descriptions, addresses, and hashtags
  • Walls that group Spots and can be followed
  • Private Spots you keep to yourself

Getting places in

  • Photos placed on the map from their EXIF location
  • Instagram posts imported as Spots
  • A share extension for other iOS apps

Discovery

  • Nearby and trending Spots
  • Search by city and a cities-traveled view

Social

  • Follow users, hashtags, and Walls
  • Likes, comments, an activity feed, and push notifications

Tours

  • Bookable tours with schedules and cancellation policies
  • Payments through Stripe and Apple Pay

Details

  • Night, retro, and silver map styles
  • Traditional Chinese localization and an onboarding walkthrough

How it’s built

A map-first native client

The iOS app is Swift and UIKit with SnapKit layouts and RxSwift and RxDataSources for data flow, built on Dephyned’s SwiftyBootstrap library. RealmSwift caches data on the device, and the Google Maps SDK renders Spots on custom-styled maps.

Geo-queries for nearby places

Showing what’s nearby needs fast radius queries over user content, not a chronological feed. Spots are indexed with GeoFire, and MapKit and SwiftLocation handle device location.

A serverless backend

Firebase Cloud Functions in TypeScript handle geo-tagging, nearby queries, Instagram import, follow and activity fan-out, push notifications, and scheduled jobs. Data lives in Firestore, with images in Firebase Storage and AWS S3, and Spot photos are labeled automatically with Firebase ML Vision.

A web companion

A React and TypeScript site on Firebase Hosting serves public Spot pages, stories, and competition and affiliate pages, with components built in Storybook.

Have an app idea like this?

Tell me about it on a free 30-minute call. You'll leave knowing what to build first and what it would cost.