A live map of dangerous wildlife, built from news, AI-checked reports, and public records
One map shows where dangerous animals have actually been, so dog walkers, anglers, hikers, and parents can check before they head out.
- 1day
- 71species
- 60fps
- 3sources
From concept to a working app with a live backend, AI photo checks, and a news scanner.
Animals and beasts of lore in the catalog by August 2026, each with its own emblem art.
Map panning after records moved to a GPU layer, up from 27.6 with one page element per pin.
Community reports, the news wire, and public research archives on one map.
The problem
Knowing that a dangerous animal was seen near a spot last week is useful to a lot of people: someone walking a dog by a pond, an angler, a golfer, a parent at a lake. That information exists, but it's scattered across local news stories, wildlife databases built for researchers, and word of mouth. Nobody puts it on one map you can check before you go.
The news side is also messy. One attack can be covered by fifteen outlets, and a story that only names a county can't honestly be pinned to a specific lake. A safety map that puts a pin in the wrong place does more harm than no map at all.
Beast Watch is Salvus's own product. It's also a test of how fast a small team can take an idea to a real, running app without cutting corners on trust.
What we built
Beast Watch is live at beastwatch.app, with the full app running in the browser and an iOS build in TestFlight. It started on July 9, 2026 as a map for a single species, and the concept and a working app with a live backend shipped the same day. Ten days later it was renamed Beast Watch and widened to dangerous wildlife in general.
The map has two realms. Wild covers real animals. Legend covers the creatures people swear they saw, like Bigfoot or the Loch Ness monster. Every species belongs to exactly one realm, so lore never mixes with safety data. Pins come from three sources: community reports, news incidents, and archive records from public wildlife databases such as iNaturalist and GBIF.
Around the map sit the Campfire (one feed of posts, sightings, and news), Trail Cam (short wildlife videos), and the Guide (species safety knowledge, a trip-planning chat, and safety briefs for any area you draw on the map). Saved watch areas send alerts when something is reported nearby.
How it works
One Expo codebase builds both the iOS app and the web app, so a test round is a website deploy instead of an app store build. The backend is Supabase, with PostGIS for location queries, scheduled jobs, and a set of edge functions that handle the AI work.
Community reports go through Claude vision before they publish. It checks that the photo is real and shows the animal claimed, flags screenshots, stock photos, and AI-generated images, and blocks exact resubmissions by fingerprinting every photo. Exact report locations are stored privately and snapped to a grid on every public read, which protects the people reporting and keeps the map from becoming a guide for poachers. Community votes can take down a report that's gone stale.
An hourly scanner reads world news for attacks and sightings, has AI drop the noise, and groups every article about one incident into a single event. Location has an honesty rule built into the database itself: a story only gets a pin when the text supports city-level confidence or better. Everything else stays in the feed, unpinned, with a note saying how far the coverage narrows it down. For attacks and fatalities stuck at county level, a separate pass searches the web for the actual body of water.
The feed is ranked in SQL on engagement, freshness, and a mix of post types, so scrolling costs nothing in AI calls.
The result
The first live news scan read 591 headlines and published 19 incidents. The first grouping pass folded 28 articles into 3 real events, and the next scan attached 23 new articles to existing events without creating a single duplicate.
Growth brought its own problems, and they were found by measuring rather than guessing. The map was quietly drawing about a third of its records, because of a database row cap no client could see and a cell picker that estimated density instead of counting it. Both were fixed. Moving records from one page element per pin to a GPU layer took panning from 27.6 to 60 frames per second with no long stalls, and the same approach later cleared up lag in the news layer on phones.
For clients, Beast Watch is the whole stack in one place: mobile and web from one codebase, AI checks wired into a real workflow, scheduled data pipelines, and the kind of measured performance work that keeps an app usable as the data grows.
It's important to know where people died.
Your turn
Same problem? Different industry?
We work with one client per vertical at a time. If your shape matches one of our dossiers, we’ll tell you straight.