Skip to content
← Back to portfolio

Project case study · Mobile system

Overview Webcams v2 (React Native)

A React Native rewrite that has been on the App Store since 2021, covering 10,000+ live webcams worldwide with a native iOS Home Screen widget and EAS updates.

React NativeExpoTypeScriptMapsiOS WidgetEAS Update
Overview Webcams v2 (React Native)

The challenge

Overview Webcams started in 2020 as a Flutter app, my second Flutter project after AnyLeft. That version was a simple map of live camera feeds from one provider. For v2, I wanted something I could maintain alone for years, update without waiting for an app-store review, and expand beyond one data source. It also needed to remain simple enough to run without a backend of its own.

The solution

Overview Webcams, published as Overview: Live World Webcams, has been live on the App Store since 2021 and is still actively maintained. Version 3.0.1 has a 4.0★ rating across 23 reviews. The app puts 10,000+ live webcams from 100+ countries on an interactive world map, covering beaches, ski resorts, city streets, harbors, and wildlife. Every camera includes a real-time weather overlay.

I rewrote the app from Flutter in Expo and React Native, now using RN 0.83, Expo 55, and React 19. NativeBase originally kept the iOS and Android UI consistent. I later replaced it with a custom theme, with light and dark palettes in one theme.ts, when the design outgrew what the NativeBase components offered.

Scroll for more →

What the app does

A live webcam map with three provider integrations

The app fetches webcams through a pluggable source registry. Windy’s live webcam network is currently the active feed. A built-in OpenWebcamDB integration is paused because its free tier limit of 50 requests per day was too low for production, but it is ready to use with a paid plan. Each camera’s coordinates also fetch current conditions from OpenWeatherMap, so a beach or ski-resort camera shows live weather instead of only a static thumbnail. Bounding-box requests are tiled and batched to stay within the Windy API’s limits at each zoom level.

Favorites with rename and reorder

AsyncStorage keeps favorites on the device, including custom names and list order, so they survive app restarts. A second AsyncStorage-backed layer tracks cameras viewed, app launches, and ad cooldown timers for each surface. Those statistics trigger App Store review prompts after 3, 10, and 30 cameras, then every 50 cameras viewed, within Apple’s limit of 3 prompts per year.

Native iOS Home Screen widget

A SwiftUI WidgetKit extension (via @bacons/apple-targets) shows the user’s favorite webcam as a live Home Screen widget, sharing data with the main app through an iOS App Group and refreshing its preview image on a 15-minute timeline.

OTA updates, no account required

EAS Update ships JavaScript fixes and content changes over the air without another App Store review cycle. It uses expo-updates with runtime versions scoped to each app version. The app is free, requires no account, and uses Google Mobile Ads banners after an initial grace period.

Architecture

Frontend: React Native on Expo with Expo Router and TypeScript. react-native-maps renders the world map and the marker clusters served by Windy’s clusters API.

Data: A source registry calls webcam providers through Promise.allSettled. Windy is live, while OpenWebcamDB is integrated but paused. A direct OpenWeatherMap integration provides live conditions for each camera.

Storage: There is no backend service. @react-native-async-storage/async-storage keeps favorites, custom names, ordering, and usage statistics on the device.

Native: A SwiftUI WidgetKit target built with @bacons/apple-targets shares state with the React Native app through an App Group container. react-native-google-mobile-ads handles banner monetization.

Distribution: EAS Build creates store binaries, while EAS Update handles over-the-air JavaScript updates. An automated script syncs the App Store name, keywords, and description from source.

Overview Webcams has been live on the App Store since 2021, making it one of my longest continuously maintained apps. It is now at version 3.0.1 with a 4.0★ rating across 23 reviews.

Have a project in mind?

Tell me what you're working on and where you need help.