BioRadar: a flora and fauna scanner built on the iNaturalist API (Expo + Capacitor)
You don't read the land from a map: you read it from its traces. A footprint, a leathery leaf, a call you don't recognize. This tool invents nothing — it queries a living archive, kept by people who have been watching the land for years, and hands it back as a target on a screen. The radar doesn't see ghosts: it sees what someone else has already spotted, close to you.
What BioRadar is
BioRadar is an Android app for identifying plants and animals, with a cyberpunk radar-scanner interface: concentric circles, a central marker, a beam that “sweeps” the area. But under the aesthetic the data is real: BioRadar queries iNaturalist[1], the citizen science platform with hundreds of millions of nature observations, and shows the species actually sighted within 20, 60 or 100 km of your position (or of a point you pick by hand on a map).
Next to the scanner there's a second, offline mode: a hand-curated archive of eight biomes — Mediterranean, temperate forest, alpine, wetlands, tropical, steppe/semi-arid, boreal, savanna — with bilingual cards on typical flora and fauna, useful when the connection is gone or you just want to explore without scanning. It's a Zone 2 project: mobile, from concept to build, shown for how it's made inside.
How it's built
BioRadar started out as an Expo Router[2] app (React Native, TypeScript) and is shipped as an Android APK through Capacitor[3]: Expo's web export becomes the WebView that runs inside the native wrapper. It's the same base as EcoSurvivor with one extra piece, because here the app also has to talk to a real external service.
- EXPO ROUTER + CAPACITOR — the three tabs (Radar, Explore, Saved) and the species detail screen come from the files under
app/, as per expo-router convention. The Android build goes fromexpo export --platform webtocap sync android: the resulting WebView runs inside Capacitor, with@capacitor/geolocationfor native positioning when needed. - REAL DATA, NOT A STATIC DATASET — the Radar screen calls iNaturalist's
GET /v1/observations/species_countswith latitude, longitude and radius: a real-time response, sorted by number of observations, with a photo, IUCN conservation status and scientific name for each species. No hand-written species database for this part: it's the real world, with today's date. - TWO CONTEXTS FOR STATE —
LocationContexthandles the current position, the hand-picked position and the saved points (withexpo-locationon native,@capacitor/geolocationinside the WebView);LanguageContexthandles Italian/English with a typed translation dictionary. Everything else reads from here. - IN-MEMORY CACHE — iNaturalist responses are kept in a
Mapkeyed by rounded coordinates and radius, and taxonomic details (including the Wikipedia summary linked to each species) go in a second cache: the same scan or the same detail, requested twice, doesn't start from zero again. - HAND-DRAWN IN SVG — the radar, the radius indicator and the UI textures are react-native-svg, not static images. Inter font, Feather and Material Community Icons, a neon palette (cyan, magenta, green) on near-pure black.
The scanner: from radius to list
The Radar screen flow is short: pick a radius (20, 60 or 100 km), hit START SCAN, and the app queries iNaturalist on the active coordinates — either the GPS ones or a point you picked by hand on the map. The response becomes a list you can filter by all / flora / fauna / birds (and other taxonomic groups), each entry with a photo, common name, scientific name in italics, a color-coded IUCN conservation status[4] code (green for “least concern”, up to red for endangered species) and the number of observations recorded in the area.
Tapping a species opens the detail screen: larger photos, the Wikipedia summary linked to the taxon (when available), and a share button. The screen can also fetch an extra photo by searching on the scientific name, for the cases where the first photo returned by the API is poor.
Explore: the offline biome archive
The second tab flips the approach: instead of querying the network, it shows a curated, hand-written dataset, bilingual Italian/English, organized by biome. Each biome has a handful of representative flora and fauna species, with a description, habitat and distinguishing traits — meant to be read, not just scanned. The app also works out the most likely biome from your current coordinates, and flags it at the top of the list as the “current biome”.
This half of the app answers a practical limit of the scanner: iNaturalist is extremely rich where there are active observers, and sparser elsewhere. The biome archive fills the gap with stable content, always available, built more for learning than for discovery in the field.
Saved and the points on the map
The third tab keeps track of your saved points: coordinates you want to find again quickly, so you can go back and scan a specific place without relying only on the GPS of the moment. From here you can also reach the app's general disclaimer, which you can recall at any time after the first acceptance.
> ui: expo router (react native) · wrapper capacitor · typescript
> live data: iNaturalist API · species_counts by lat/lng/radius · in-memory cache
> offline data: hand-written biome dataset · it/en · no network required
> position: expo-location (native) / @capacitor/geolocation (webview)
> graphics: react-native-svg · inter font · feather + material community icons
Frequently asked questions
What is BioRadar built with?
It's an Expo Router app (React Native, TypeScript), exported as web and packaged with Capacitor to produce the Android APK. Positioning uses expo-location or @capacitor/geolocation depending on the platform.
Where do the species shown in the scanner come from?
From the public iNaturalist API, queried in real time with the coordinates and radius you choose. They're real observations uploaded by the iNaturalist community, not a static catalog written for the app.
Does it work without a connection?
The scanner doesn't, because it depends on the API. The Explore tab, with the archive of the eight biomes, is entirely offline: no network calls, data already included in the app.
Does the app track my position anywhere?
Your position is only used to query iNaturalist and for the points you choose to save locally on your phone. There's no BioRadar server collecting or storing your coordinates.
Is BioRadar part of a bigger catalog?
Yes: it's the first of the three pillars of the Survival Apps catalog, the one dedicated to knowing and respecting the nature around you.
A radar creates nothing: it amplifies what's already there, and makes it readable at a glance. Whether the next target on your screen is a heron on a canal bank or an oak that was here before you — the signal was always there. It just needed someone to stop and listen.
Notes
- iNaturalist — a citizen science platform that started as a university project and is now run together with the California Academy of Sciences and the National Geographic Society: anyone can upload photos of plants and animals they've observed, which are identified by the community and become open data available through an API. ↑ back to text
- Expo Router — Expo's file-based navigation system: the folder structure under
app/defines the screens and their routes, the way the pages of a website work. ↑ back to text - Capacitor — a native wrapper that packages a web app (here: Expo's web export) inside an Android/iOS WebView, giving it access to native features such as geolocation, filesystem and notifications through plugins. ↑ back to text
- IUCN conservation status — the International Union for Conservation of Nature scale that classifies a species' risk of extinction, from LC (“least concern”) to EX (“extinct”), passing through NT, VU, EN and CR. ↑ back to text
SURVIVAL APPS