Sheet01
SubjectProvocation
Studies cited4
DeterminationCategory gap
01. Provocation

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.

~50%
Mushroom app accuracy in independent testing
Mushroom Appreciation, 2024
15%
Failure rate of best-performing app tested
npj Science of Food, 2026
27%
iNaturalist's death cap identification rate
citizen.org mushroom AI report
7,250+
US poison control calls about mushrooms in 2023
Mushroom Appreciation
The key finding

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.

Sheet02
SubjectResearch
MethodObservational
DeterminationFour pillars
02. Research

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?

Competitor teardown matrix Research artifact
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
Sporeprint's next action is "verify." That is a fundamentally different product philosophy than anything else in the category.

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.

Finding. Overtrust prevention

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.

Finding. Novice users

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.

Sensory gap analysis Research artifact
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
The AI's limitations define the Verify step's feature set more precisely than any user research could.
Sheet03
SubjectPoint of view
Pillars4
DeterminationHeld
03. Point of view

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.

01
Explainable AI in a consumer context
Show confidence without overwhelming. Communicate that the model is 94% sure, but the 6% matters because the lookalike is toxic. Uncertainty is information, not failure.
02
Progressive ecological literacy
A beginner sees "oak tree." A returning user sees "white oak. Note the rounded lobes." Same UI, adaptive depth. The goal is the user's growing independence, not continued engagement.
03
Designing for the outdoors
One-handed use, sun glare, gloves, spotty signal, battery anxiety, and the five-second attention window before a bug flies away or the light shifts. Every field mode screen has a single dominant action. No dead ends.
04
The honest game
Collection mechanics without turning ecosystems into loot. No streaks. No rare-species FOMO. The dex fills because the user is learning, not because the app is manipulating. Milestones unlock understanding, not rewards.
Sheet04
SubjectSystem
Sources4
DeterminationSettled
04. The system

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.

The critical architectural separation · v1

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

System layer diagram System artifact
iOS DEVICE Expo / React Native ON-DEVICE CAPABILITIES Always available, no network required Camera 4-shot guided GPS location · elev. Sensors gyro · light Haptics feedback SQLite offline LOCAL STORAGE Observation photos · GPS metadata Deferred pending sync status LOCAL SAFETY DATA Toxicity database ships with app never touches API APP LAYER Field mode Reflection mode Threshold logic AI LAYER Network required iNaturalist API Computer vision Regional checklists Claude API Explanation layer Pattern insights DATA SOURCES Open-Meteo / NOAA GBIF / USDA Plants iNaturalist obs. DB LEGEND online request structured output back internal data query safety layer Toxicity database lives entirely on-device. A network failure must never cause a deadly species to render without its warning.
In v1, iNaturalist received the photos and Claude received only the structured output that came back. The toxicity database never touches an API. It ships locally, so safety flags survive any network failure, and that holds in v2 too.
Identification request flow System artifact
Capture photos · GPS · sensors Connectivity check online now, or queue? offline Deferred queue syncs when connected not a dead end online iNaturalist API computer vision on photos returns: candidates + scores App confidence routing threshold logic. design decision very low Uncertainty state 4 causes actionable next steps medium / high Claude API input: scores only. never photos output: feature JSON UI render: Identify · Verify · Lookalike comparison ARCHITECTURAL BOUNDARY · V1 ↑ iNaturalist saw photos spacer ↓ Claude only saw structured output LEGEND online flow offline / deferred low-confidence routing render to UI
In v1, Claude never saw the photos, only the structured iNaturalist output. That separation was the key architectural decision of the original pipeline. Either way, explainability is a prompt engineering and UX problem, not a computer vision problem.
Render chain. From source to screen element System artifact
SOURCE IDENTIFY SCREEN VERIFY SCREEN iNaturalist API candidates + scores Claude API feature JSON App threshold logic design decision Capture metadata which shots taken Toxicity DB local · ships with app Verify templates local · per feature iNat photo API Confidence bar + % raw iNaturalist score Confidence label "high / uncertain / cannot ID" "What the AI saw" bullets Claude structured JSON Also-considered list iNaturalist ranked candidates Toxic lookalike flag local lookup · network-independent Missing shot note capture metadata Feature to check Claude diagnostic output Reference photos iNaturalist photo API Answer options local template per feature type Toxic flag. always persists visible through every step drives an Identify screen element drives a Verify screen element safety-critical · network-independent
The verify template library defines the universe of possible verify steps. Claude selects which feature to check. The app selects the template for rendering it. Answer options are never AI-generated. They're consistent across all species for a given feature type.

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.

The trade-off, stated plainly · v2

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.

Sheet05
SubjectCraft
Wireframes8
DeterminationRecorded
05. The craft

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.

Lo-fi design principle

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.

Lo-fi prototype

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.

Shots0 of 4
Confidence
ScreenCapture

Tap the shutter. Skip the underside if you want to see what it costs.

The product's arc in one sentence

"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.

Sheet06
SubjectCritique
Findings6
DeterminationCorrected
06. The critique pass

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

Identify screen: confidence label is too quiet

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.

Verify card: toxic band needs persistence

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.

Lookalike comparison: uses ad-hoc safety treatment

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.

Pattern insights: category color too prominent

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 verify card needed a "skip" affordance

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 uncertainty state taught restraint with red

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.

On-device safety. Toxicity read from 200 bundled species. It never touches the network, so no signal can hide a warning.
App threshold logic. How sure to sound. Calibrated at 0.65 and 0.45, separately from the bar it sits above.
Claude Vision. Species, ranking and the observation bullets, from one call that sees all four shots.
Your photograph. The ground everything else sits on. The screen’s job is to honour it.

Tap the shutter to try it · open full screen for the source panel ↗

Sheet07
SubjectTradeoffs
Open questions5
DeterminationUnresolved
07. Honest tradeoffs

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

Cut. adaptive shot sequence

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.

Cut. social / community features

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

Uncertain. confidence thresholds

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.

Uncertain. proactive insights

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

Earlier fungi-specific testing

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.

Sheet08
SubjectBuild
Tests passing140
DeterminationRunning
08. The build

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.