Skip to content
Pingo App Store screenshot: every saved place on one map.

2026 · Engineering

Pingo

Built an iOS app that turns TikTok, Instagram, Threads, X, and YouTube posts into map pins for a fraction of a cent each. Solo: research, design, code, and infrastructure, Mar–Jun 2026.

Solo build · Mar – Jun 2026

iOS appMulti-model LLM pipelineImage OCRPostGISMapbox

Extracts from

TikTokInstagramThreadsXYouTube

Results

5 platforms live~$0.00004 per extractionSolo build

Context

Pingo is a restaurant discovery app. You share a TikTok, Instagram, Threads, X, or YouTube post to Pingo from the iOS share sheet, and it finds the venue and drops a pin on your personal map. Friends can follow each other's boards. The longer bet is that a saved recommendation is pre-visit dining intent, a signal restaurants and brands would pay for.

I built all of it alone: the research, the interface, the extraction pipeline, the database, and the release process. The stack is React Native with Expo and TypeScript, Supabase with PostGIS, Mapbox, and OpenRouter for model access.

Constraints

  • One person and no budget for expensive inference: every extraction has to cost close to nothing.
  • Social platforms offer no clean way to get a venue out of a post. Instagram's public embed data degraded in late 2025, and Reddit's terms restrict AI use of its content.
  • iOS only, so the share sheet had to become part of the product, not just an entry point.

Problem

People find places in short videos and carousels, save them to platform bookmarks that can't be searched or mapped, and never go. The post rarely says the venue cleanly: sometimes it's in the caption, sometimes only in text over an image, sometimes in a tagged location or the comments.

Making that work across five platforms, cheaply and reliably, was the technical problem.

North starShare-to-correct-pin success rate across platforms, with a design target of about 90%.

Decisions

Decision 01

Route models by cost, not by prestige

Options
One frontier model for everything, or a cascade of cheap models with fallbacks.
Evidence
A script I wrote to compare six vision models on real TikTok carousels, plus per-token pricing on OpenRouter.
Chose
Text extraction runs Llama 3.3 70B first with one retry, then falls back to Claude 3.5 Haiku. Reading text out of carousel images runs Qwen3-VL 8B first, then Gemini 2.5 Flash Lite. Temperature is zero everywhere.
Didn't build
A single large model for every call.
Cost
The fallback costs about nine times the primary (roughly $0.00036 versus $0.00004 per extraction), and there are more model behaviors to test.
Decision 02

Buy the fragile part

Options
Maintaining my own scrapers and oEmbed calls per platform, or one third-party data API behind a typed wrapper.
Evidence
Instagram's oEmbed data degraded in November 2025, and per-platform scrapers kept breaking.
Chose
Ensemble Data API as the shared substrate for TikTok, Instagram, Threads, and X, with retries, a circuit breaker, and daily budgets on expensive cascades. The old TikTok oEmbed and page-scrape path stays as a fallback. I ripped out the Instagram oEmbed pipeline entirely.
Didn't build
In-house scrapers for every platform.
Cost
A paid dependency on a third-party vendor, and a daily cap on the costlier fallback lookups.
Decision 03

Ship what each platform's terms allow

Options
Adding YouTube and Reddit by whatever method worked, or only by official routes.
Evidence
I wrote a research report on YouTube and Reddit terms: YouTube transcripts need OAuth and edit rights, and Reddit's terms restrict AI use and sharing data with third parties.
Chose
YouTube through the official Data API (title, description, up to 50 comments) with quota tracking, live. The Reddit adapter is built and tested but held until Reddit approves API access.
Didn't build
Transcript scraping and any Reddit call that sends raw content to a third-party model.
Cost
Five platforms live rather than six, and YouTube extraction relies on descriptions and comments, not what's said in the video.
Decision 04

Let people make their first pin before they sign up

Options
A slide-based tour, or an onboarding that ends with a real saved place.
Evidence
The product only works after one successful share, and the share sheet is not obvious to new users.
Chose
An interactive onboarding: pick preferences, see a real TikTok, walk through an emulated share sheet with one live target, and save a real pin under an anonymous account, then sign in with Apple or Google to keep it. The server caps anonymous sessions at one extraction.
Didn't build
A static walkthrough.
Cost
A lot of build for one screen flow: a gesture-locked embed, a share-sheet clone, and identity linking at the end.

Solution

A share becomes a job in a Supabase edge function. It detects the platform, pulls the post's caption and metadata, runs the cheapest model that can extract the venue, reads carousel images with a vision model when the caption isn't enough, geocodes the result, dedupes against the venue table, and writes the pin. A health view over the audit log reports per-platform success and failure rates and flags any platform above a 20% failure rate.

Pingo App Store screenshot: every saved place on one map. Pingo App Store screenshot: switching between friends' maps. Pingo App Store screenshot: shared collections.
The map, friends' maps, and shared collections a user ends up with, from the App Store listing.

Outcome

Five platforms extract live (TikTok, Instagram, Threads, X, YouTube), a sixth (Reddit) is built and waiting on approval, and the v3.25 release with the interactive onboarding and public profile pages passed 15 of 15 checks on a physical device.

Text extraction runs at about $0.00004 a post on the primary model, based on model pricing rather than billing data. I don't have public user or retention numbers to report.

Do differently

  1. Measure extraction quality from the first platform. The per-platform health view only arrived after I had four platforms live.
  2. Pick the data layer before writing scrapers. I built and later removed the Instagram oEmbed path.
  3. Test the social graph with real users before building it. I replaced mutual friend requests with asymmetric follows after shipping them.
Next project AI Surveillance with Radar Systems