This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass
I built WildProof: an offline-first field observation app that turns a short walk into a small investigation.
WildProof is for hikers, students, citizen scientists, and anyone who wants to spend less time scrolling and more time paying attention to the world around them.
The experience is intentionally simple: Choose a mission such as Habitat Comparison or Pattern Hunt. Leave the screen and collect observations. Capture written notes and photo evidence references. Save the expedition locally, even without connectivity. Return to analysis when a backend is available. Review a structured report that makes uncertainty visible.
WildProof is not a “guess the species from this photo” app. It does not pretend that uncertain AI guesses are facts.
Every report separates: Observed — directly supported by the submitted evidence. Inferred — a reasoned deduction from the available evidence. Unknown — a claim that needs more evidence.
The main walkthrough is: Start a Pattern Hunt mission. Add a field note and photo evidence. Generate a report through the Temporal-backed path. Review observed, inferred, and unknown claims. Inspect missing evidence, the suggested next step, and the evidence-quality score.
WildProof is a React and TypeScript progressive web app backed by FastAPI, Ollama, Gemma 2B, and Temporal.
That means a user can: Start a mission without signing in. Capture notes and photo evidence references without a network connection. Refresh the page without losing the expedition. Return to analysis later when the backend is available.
Photos are currently stored locally as evidence references. The current text-only Gemma path receives written notes and photo metadata; it does not receive image pixels or claim to visually identify the contents of a photo.
The backend sends the mission type and collected field notes to Gemma and requests a strict JSON report:
The response is validated against a Pydantic schema before it reaches the frontend. If Gemma returns malformed JSON, the API makes one repair attempt. If that also fails, the application surfaces an explicit failure instead of manufacturing a successful report.
If the local model is unavailable, the expedition remains preserved locally and the UI shows a clearly labeled fallback state.
Local model inference can fail because of timeouts, unavailable services, or temporary infrastructure problems. WildProof uses a Temporal workflow to coordinate the analysis stages:
The frontend uses the Temporal-backed endpoint by default and includes a switch for the direct FastAPI path.
The value of Temporal here is not just adding another service. A failed activity can be retried without discarding the evidence collected during the walk or restarting the entire expedition.
WildProof calculates a transparent quality score from structured evidence features such as: Number of photos. Number of notes. Total note length. Expedition duration.
The repository includes a reproducible baseline-versus-TabPFN experiment for small tabular datasets in api/tabpfnexperiment.py.
