The apps name it. They don’t teach you to look.
iNaturalist, Seek, Merlin, Picture This. They all answer the same question and then stop. You point, they name it, you move on, and nothing you learned comes with you to the next mushroom. They hand you answers. None of them teach you to find answers yourself.
"Like a true magician, it doesn't reveal its methods... it doesn't really help you learn how to identify birds."
Northern Woodlands review of Merlin, 2023
That critique of Merlin is the brief for Sporeprint, stated by someone else. The best app in the category, the one that comes closest to what Sporeprint is trying to do, still fails at the core problem. And Merlin is for birds, a domain with no safety stakes. For foraging, the failure mode isn't just educational. It's physical. People die from misidentified mushrooms, and the stakes deserve a product that takes them seriously.
A peer-reviewed Nature study published February 2026 concluded that none of the tested applications could be trusted for definitive identification decisions. The correct response is honest UI design, not a better model. The problem isn't accuracy itself; it's that no app designs around the truth that accuracy is limited.
What foragers argue about online.
Foragers argue in public. App Store reviews full of wrong IDs, r/mycology threads picking apart edge cases, iNaturalist observations the community quietly corrects. I read those instead of running interviews, because people say what actually goes wrong when they think nobody official is listening.
Competitive teardown
Four apps analyzed against the same four questions: what does each do when the AI is uncertain, does it ever explain why it made an identification, does it teach anything (or does it just answer), and what does it want the user to do next?
| Question | Seek | iNaturalist | Merlin | Picture This |
|---|---|---|---|---|
| When AI uncertain? | Stops at genus, no explanation | Shows top suggestions, no confidence signal | Shows candidates with photos to compare | Shows % with no guidance on meaning |
| Explains the ID? | Never | Never | Partially. Field marks in species detail | Never |
| Teaches anything? | Badges only | Community IDs sometimes | Step-by-step ID builds observation habits | Care tips ≠ ecological literacy |
| Next action? | "Earn a badge." Collect more | "Add to observation." Contribute | "Explore this bird." Go deeper | "Upgrade to Pro." Convert |
| Fungi handling | No safety framing for lookalikes | Community can flag, not proactive | Birds only. N/A | IDs fungi but no toxicity context |
What the research found
There is a substantial body of peer-reviewed research using mushroom identification as the test case for explainable AI, and the findings directly validate Sporeprint's design approach. All of it was found before any screen was designed.
Nearest-neighbor examples (showing the user similar species side by side) were best at preventing overtrust. This is the direct brief for the "also considered" section on the Identify screen.
Interactive explanations achieved the highest average trust ratings. Novice users were most influenced by explanation presence. Sporeprint's primary audience is the most responsive to its core mechanic.
What the camera can’t sense
The sensory gap between what a camera can capture and what experienced foragers rely on is not a limitation to apologize for. It's the design brief for the Verify step. Every sensory channel the AI cannot access is a verification prompt Sporeprint can own.
| Feature type | AI capability | Sporeprint design response |
|---|---|---|
| Visual features (cap, color, gills) | Partial. Needs multiple angles, good light | Guided multi-shot capture with orientation prompts |
| Physical dimensions | Cannot sense | LiDAR measurement overlay (v2) or manual prompt |
| Smell | Cannot sense | Verify step: multiple-choice smell descriptors per species |
| Substrate relationship | Partial. ARKit scene understanding | User confirms tree species; GPS + elevation as context |
| Spore print color | Cannot sense | Deferred step: "come back with a spore print photo" |
| Bruising / chemical reaction | Cannot sense | Guided test prompt; user photographs result |
What the app owes a beginner.
Identification is solved. Learning isn’t. Four pillars came out of that, and they are the reason several obvious features are missing from this app on purpose.
How a guess becomes something you can check.
The model names the mushroom. The app has to make that name checkable by someone holding a specimen in one hand, in bad light, possibly about to eat it. So every element on screen has to say where it came from.
iNaturalist receives the photos and returns candidates with confidence scores. Claude never sees the photos. It receives only the structured output (species names, confidence percentages, taxon group) and translates that into plain-language feature explanations. This is a prompt engineering and UX problem, not a computer vision problem.
System architecture
The render chain
Each UI element on the Identify and Verify screens comes from a specific source. The confidence bar renders the raw iNaturalist score. The confidence label is app-side threshold logic. The "what the AI saw" bullets come from Claude's structured JSON. The toxic flag is a local lookup that never touches either API, because a network failure should never mean a deadly species appears without a warning.
The architecture evolved
Everything above describes v1: identification and explanation lived in separate systems, and the design thesis hinged on the fact that the photograph never reached the language model. In a later iteration that pipeline collapsed. The four diagnostic shots now go to a single Claude Vision call that returns the candidate ranking and the observation bullets together. Three things drove the change: the model sees all four angles at once instead of iNaturalist scoring only the first photo; the "what the AI saw" bullets are grounded in what the model actually observed rather than reconstructed from species metadata after the fact; and the pipeline sheds an external dependency and an authentication surface.
v1's strongest property was that no photograph ever reached the language model. v2 gives that up: the photos now go to Claude Vision. What survives is that the design work is still the translation layer. Whether the model is iNaturalist or Claude Vision, the problem is the same: making the system's reasoning legible to a person standing in a forest with one hand free. And the part that protects people did not move. The toxicity database still lives entirely on-device and still never touches an API, so a safety flag never depends on the network.
Grey boxes first.
Grey boxes only, because colour would have hidden whether the layouts worked. A few didn’t: empty states got redrawn, Verify split into steps, and the Dex stopped trying to be a feed.
Every element on a field mode screen must earn its place against a single test: does this help the user make a better decision about what they're holding? If not, it doesn't exist yet. The Capture screen has one dominant action, the shutter. The Identify screen has one dominant action, "look closer." Field mode never dead-ends.
No colour yet, on purpose. Skip a shot and the confidence drops: the app should sound less sure when you’ve given it less to go on.
Tap the shutter. Skip the underside if you want to see what it costs.
"The AI makes a guess, you make the call" (onboarding screen 1) traces directly to "do not eat this specimen" on the lookalike resolution screen. The honesty established at the beginning is proved at the highest-stakes moment in the product.
Where the screens got safety wrong.
A chanterelle and a jack-o’-lantern differ in one place: the gills. Forking blunt ridges on one, sharp crowded blades on the other. If a screen ever lets that distinction go soft, somebody eats the wrong thing. Each of these is a place where a screen let that distinction go soft.
Some came from reading the screens against the component library. Others came from printing them out and looking again, next to a photograph of a real chanterelle. Two of the six are places where the early screens had it right and the library was what needed changing.
Six things I got wrong
The lo-fi shows the confidence label as small caption text below the bar. The component system establishes that the label should be the same size as the percentage and visually paired with it, because the label cues behavior ("verify and proceed") and the percentage is just data. In hi-fi, the label moves up in hierarchy and the percentage becomes secondary. Same information, reordered priority.
The lo-fi shows the toxic species warning as a one-time callout that disappears when the user advances steps. The component system establishes that the toxic band must persist through every step of verify when a deadly lookalike is in the candidate list. The lo-fi version of this screen ships without a toxic band on step 2 and step 3, which would be a real safety bug. Hi-fi corrects this.
The lo-fi screen designs its own toxic flag inline. It works visually, but it's a separate decision from the toxic flag system that emerged later. In hi-fi, the lookalike comparison's deadly-species header should resolve to the same component family as the candidate pill flags and the verify-card toxic band: three sizes of the same identity, not three different decisions. The lo-fi version was right about the gravity, wrong about the system.
The lo-fi shows category colors as full-width banner backgrounds (the green band across habitat insights, amber across seasonal). The component system replaced this with a 3px left stroke and a small typographic label, because banner colors dominate the read and announce the category louder than the content deserves. Hi-fi adopts the lighter treatment.
The lo-fi's "skip this check" link was added intuitively as a way out for users in awkward field situations (no spore print available, can't access the stem base without damaging the specimen). The component system originally didn't include this, only "not sure" routing to expert. The lo-fi was right. Skip is a different action than not-sure: skip means the user can't perform this verification right now, not-sure means they tried and couldn't tell. The component system was updated to reflect both.
The lo-fi version of the uncertainty state used red borders and tinted backgrounds across all four causes, treating uncertainty as "the AI failed" with a warning aesthetic. Designing the four causes as distinct variants showed that only one of them (deadly lookalike similarity) actually warrants the safety-red treatment. The other three use amber and lavender-gray. Red belongs to the safety axis. Using it for ordinary uncertainty makes it mean less when something really is dangerous.
Fixed, and running
All six are fixed in the build. The toxic band persists across all three verify steps instead of vanishing after the first. The confidence label carries the weight and the percentage recedes to a hairline. The flag treatments resolve to one component family at three scales. Rather than show you those fixes as another set of stills, here is the build itself.
Four decisions, stacked in register. Each one lands in turn.
Tap the shutter to try it · open full screen for the source panel ↗
What still bothers me.
Things I am still unsure about. Some are features left out that may turn out to be needed. Some are places I picked one of two reasonable answers and won’t know which was right until people use it.
What I cut
The capture flow uses a fixed four-shot sequence rather than an AI-adaptive one that suggests the next angle based on what it's already seen. Adaptive is more powerful but significantly more complex. Fixed is learnable and consistent. MVP fixed, v2 adaptive.
No in-app community. No sharing within Sporeprint. The citizen science contribution goes directly to iNaturalist where the expert community already exists. Building a parallel community would dilute both without serving either.
Still unresolved
The bands that separate high, medium, and low confidence states are design decisions that will need calibration against real usage data. Setting them wrong in either direction produces bad outcomes, overtrust on one side and paralysis on the other.
Should pattern insights be surfaced proactively via notification, or only discoverable in the insights tab? Proactive surfacing respects attention if it's rare and high-signal. But "you've found 3 oak species" as a push notification may feel algorithmic rather than like genuine discovery.
What I’d do differently
The iNaturalist computer vision model has decent species coverage but struggles with fungi, which is also the highest-stakes identification domain. The lookalike comparison screen and uncertainty state do more work for mushrooms than they ever could for plants or insects, and that asymmetry is now explicit in the product positioning. Sporeprint is a mushroom app, not a foraging app. Plants, berries, and herbs are out of scope. The narrower focus produces a sharper product, and the people we lose by excluding plants are the people who would have been confused by a tool that tried to do everything.
What it does now.
It runs. Capture, identify, verify and dex, on a real phone, against real specimens, with the safety data sitting on the device.
What’s built
React Native and Expo over SQLite. The four-shot capture, one Claude Vision call that returns the ranking and the observations together, the verify sequence, the dex, pattern insights, and a deferred queue for when there is no signal. 38 source files, about 11,000 lines of TypeScript.
What protects people
A database of 200 species, 14 of them deadly, bundled into the app and read entirely on the device, so a safety flag never waits on a network call. It is covered by 140 tests. One of those is a referential-integrity check, and it caught 16 lookalike references pointing at species the database did not actually contain. Those specimens would have rendered with no warning band at all.
What isn’t done
There is no TestFlight build yet, so I am the only person who has used it. Running the real thing on a phone is how the screens above got their last round of fixes, but one person testing their own design catches a fraction of what is wrong with it.