Hi! I’ve been working on this site that lets iNat users visualize their observations as taxonomic trees with a few different modes. It uses markmap to make the trees. It’s still kinda quirky and I would love some feedback if you can mess around with it. I’m not a developer so I’m just trying things.
Explore - View your observations and your first observation pic for each species
Timelines - Needs more work, but the idea is you can play a timeline of your observation taxonomic tree and see how it grew over time
Checklist - Compare your observations to a region’s checklist (currently just U.S. states and Canadian provinces/territories). US checklists from February 2025, Canada August 2025. Mexico next. I need a better way to update these checklists rather than exporting csv files manually.
This also creates a leaflet map of species you haven’t seen yet with their Open Range Maps (from the Geomodel) and some observations within your chosen region. iNaturalist Open Range Map Dataset. I’m looking for other ways to expand the map functionality.
Looks cool - but it doesn’t display all the species. Maybe I did something wrong? I tried butterflies and moths. For example Papilionidae - there are only 3 species, but it just gives the node Papilionidae without any species. In most families or genera it leaves out something.
Thanks for testing this. Oops yea, I can see it isn’t grabbing the full species list for a large taxon and many observations. I can fix this up. Good catch
Looks very interesting, but shouldn’t this app basically just be reading data? Not creating or updating? What is the purpose for these requirements? Especially relating to identifications? Being a curator, does this mean your app could access curator only things like the moderation history of other users since it basically says it can read any information you can see?
Good question. The app just reads your observations, only GET endpoints. I don’t believe there is a curator/moderation endpoint that allows to see other’s moderation history or anything of that sort.
I’ll look into the scope to see if i can reduce the permissions required so it just needs login and/or read. But I think right now, iNaturalist requires the write permission to exchange for the JWT token and access to higher API limits that allows this app to work AFAICT, though I could be wrong.
For your other question: Yes, you could make some app to post observations and populate comments I suppose. Though there is no Computer Vision endpoint, you’d need to identify some other way.
I would be happy to hear from somebody more familiar here to see if a strictly read-only permission mode is possible while still being authenticated. It seems all or nothing to me right now.
This is super cool! I can see myself using this for the course I TA in university.
The only issue I am having is when exporting, the background is dark and for some reason the font darkens as well when on the site it is white. I’ve attached an example.
Also, whenever you are looking for enhancements - could you add an option to select Identifications for a selected date range? Like say I am part of a bioblitz for a local area and I want to create a tree for all taxa I observed during that time period.
getting observations / observation-related information through the usual API routes usually doesn’t require authorization, unless you need private coordinates. if you’re doing something more exotic to get observations, such as going through the undocumented export module to get observations as a CSV, then that does need authorization. or if you’re getting some information from undocumented list APIs, then that could also require authorization.
i haven’t looked at your application or how it works, but just based on the images, i would make a couple of comments:
if you don’t actually need observation-level information, it’s usually going to be more efficient to get aggregated information. for example, if you’re mostly interested in taxa and their relationships, then taxonomic tree information can be obtained via an undocumented endpoint /observations/taxonomy (which is the thing that provides data for dynamic life lists). for example, this displays your verifiable observations in the USA: https://jumear.github.io/stirfry/iNat_observations_taxonomy?user_id=mmulqueen&place_id=1&verifiable=true. note that this isn’t super efficient if you have a boatload of taxa, but it’s probably still the best option you have, and i think you’d run into other issues with other approaches before this kind of limitation affects this approach.
it’s theoretically possible to get lists dynamically from the system via an undocumented list endpoint https://www.inaturalist.org/lists/{id}.json (requires authorization), but it’s not particularly efficient if your list contains a ton of taxa. you could use the dynamic life list data to get similar data, although it won’t include taxa that were manually added to the lists (as opposed to documented via observations in the system).
I built the taxonomy ancestor ids from some big iNat export I found somewhere. So these are all going to be outdated of course as taxonomy updates. That taxonomy endpoint could be useful in pulling in changes perhaps.
I’ll try to remove the authentication and see if I can get that going because you’re right this app doesn’t need hidden coordinates or anything like that. At some point I thought I needed it for a bigger API throughput but that might not be necessary either. I’d like to do away with authentication.
right. the API route for getting that information is via https://www.inaturalist.org/check_lists/300-Massachusetts-Check-List.json, but if you look at the end of the response, you’ll see that particular list has ~16000 taxa and (based on max 200 taxa per page) will require 80 requests to get the whole list. it does include ancestry information though.