Open source · AGPLv3 · No ads

A free map of food growing around you.

Forage for All is a community-run map of fruit trees, berries, nuts, and edible plants on public land. Drop a pin. Share what's ripe. Eat from your own neighborhood.

🍎 🫐 🍐 🌿 🍊 🍑 🫒

Built on four promises.

Community apps live or die on trust. Here's ours — in code, not marketing.

💚

Free forever

No ads, no subscriptions, no paywalls. Food on public land should stay free to find.

🔒

Your data stays yours

Fuzzy locations by default. Reports can be anonymous. No analytics SDKs. No trackers. Ever.

🌱

Open source

Licensed AGPLv3. Read the code, file issues, send pull requests. If we ever stray, fork us.

🤝

Volunteer-run

Built by foragers for foragers. The map is only as good as the community that tends it.

The map isn't empty when you open it.

3,603 seeded pins in Nevada County, CA. Global coverage via 7 open data sources.

Every listing carries a source tag. Toggle data layers on and off in the app — each source shows up as its own pin color, with license and attribution.

Community pins

People dropping pins right now, coordinates fuzzed to ~110m for privacy.

AGPLv3 · CC BY-SA 4.0 (data)

iNaturalist

Research-grade plant observations verified by the iNaturalist community.

CC BY-NC 4.0

GBIF

Scientific occurrence records from the Global Biodiversity Information Facility.

CC0 / CC BY 4.0

OpenStreetMap

Fruit and nut trees tagged by OpenStreetMap contributors worldwide.

ODbL

Falling Fruit

Public-land foraging locations from fallingfruit.org.

CC BY-SA 4.0

City tree inventories

Edible species from SF DataSF, NYC Street Tree Census, and Portland Maps.

PDDL / CC0

How foraging works here.

Three simple moves, repeated by thousands of people, make a living map.

i.

Spot it, pin it

Walk past a fig tree on a public sidewalk? Drop a pin, snap a photo, pick the species. Takes 30 seconds.

ii.

See what's ripe

Every pin has a ripeness ring that fills as the season progresses. Others confirm throughout the year.

iii.

Harvest mindfully

Take what you need. Leave half for the birds and the next forager. Mark "still there" for the community.

The ripeness ring.

A glance at any pin tells you whether it's time to go, wait, or come back next month.

Unripe

Too early. Don't pick.

Forming

Fruit is setting.

Soon

A week or two.

Ripe

Go now.

Past

Wait for next year.

Documentation.

Setting up locally, running the app, contributing.

Install the app

Web: open the app right now at jphein.github.io/forageforall/app/ — no install needed. Works on desktop and mobile browsers.

Android: grab the latest preview APK from GitHub Releases, enable "Install from unknown sources," and tap to install. The build uses the live InstantDB backend — pins you drop are real.

iOS: store build is in progress; simulator bundle is also attached to each release. App Store submission is on the roadmap.

Local setup

The whole stack is Expo + InstantDB + Google Maps. You'll need Node 20+, an InstantDB account (free), and a Google Cloud project with Maps SDK enabled.

git clone https://github.com/jphein/forageforall.git
cd forageforall
npm install
cp .env.example .env        # fill in INSTANT_APP_ID + Maps keys
npm run schema:push
npm run seed:species
npm run seed:listings       # optional: pull open-data pins from iNat, OSM, GBIF
npx expo start              # scan QR with Expo Go, or npm run ios/android

Full instructions — including Google Cloud key restriction, EAS build profiles, and CI — are in the repo's README.md.

Architecture at a glance

  • Expo Router for file-based navigation
  • InstantDB for realtime sync — all listings, reports, and comments are live on other devices within ~200 ms
  • Geohash prefix queries for viewport-scoped map loads (Instant has no native geo yet)
  • Layered open data — every listing is tagged with its source; the map renders each as a toggleable layer with license + attribution
  • Idempotent seeds — species IDs are SHA-1 of latin name, listing IDs are SHA-1 of sourceId, so re-runs upsert instead of duplicating
  • Two-phase ripeness — seed time: species season × current month; runtime: time-weighted average of recent user reports (half-life ~1.4 weeks)
  • Fuzzy locations by default — user-submitted coords rounded to ~110 m; open-data imports at ~11 m (already public)

Add species to the catalog

We ship ~85 edibles, covering worldwide fruits and nuts plus Sierra Nevada + California natives (manzanita, toyon, bay laurel, valley oak, sugar pine, etc.). Add more by editing scripts/species-data.ts — the single source of truth imported by both seed-species (pushes entities) and seed-listings (links imports + computes ripeness from season). Include accurate latin names, seasonality, and — critically — toxicity and look-alike warnings. Uncited species get reverted.

Translate

i18n scaffolding lives in the i18n branch. Pick up any language — we'll review and merge.

Foraging ethics

Every contributor agrees to reflect these in code, copy, and community moderation:

  • Never publish private-property pins without permission.
  • Never publish pins in protected habitats where harvesting is illegal.
  • Honor the "leave half" rule. Birds, insects, and next year's seeds need their share.
  • Flag roadside and industrial-adjacent finds with pesticide / contamination warnings.
  • Cite reliable sources when entering toxicity or look-alike data.

Questions.

Is this legal?

Foraging laws vary wildly by city, state, and country. We encourage users to only pin on public land, flag private-property finds, and consult local ordinances. We're a map, not a lawyer — but the community actively moderates out protected-land and private-property pins.

How do you make money?

We don't. The app is volunteer-built and donation-funded when hosting costs need it. InstantDB + Google Maps have generous free tiers, so running costs are low. If the project ever takes donations, the ledger will be public.

What about sensitive spots like morel patches?

Fuzzy locations are on by default — pins snap to ~110m, not exact GPS. You can also mark pins as private to your account, or opt out of sharing altogether. Critical-habitat species (rare mushrooms, etc.) can be blocklisted by moderators.

Can I identify plants with my camera?

Not in the app itself — plant ID is hard to get right, and wrong IDs can poison people. We link out to iNaturalist for identification and require a human to pick the species from our curated catalog before a pin goes live.

Why AGPLv3 and not MIT?

Because a hosted service that takes this code, closes it, and runs ads on top of community-contributed data would violate the spirit of the project. AGPL requires that anyone running a modified version as a service also share their source.

How can I help?

Pin finds in your neighborhood. Confirm other people's pins when you walk by. File issues on GitHub. Add species via a PR. Translate. We especially need botanists, regional moderators, and iOS/Android developers.

Eat from your own neighborhood.

Free app, open code, living map. Start spotting what's been growing around you all along.