What I built
Fieldcard is a single-command tool that turns "I have 90 minutes" into a one-page printable A5 field card. You type a command (or fill a form), wait 10 seconds, and walk out the door holding a card that tells you:
- A mission written for your exact terrain and season
- A radial map of real nearby parks, water, and viewpoints pulled from OpenStreetMap
- A "notice nine things" bingo grid tuned to what's actually observable right now
- Sunset time, turn-around time, and how far you can reach — all computed in code, never guessed by the model
- Live weather conditions and real local species from iNaturalist
The screen is the shortest part. That's the point.
# Generate a 90-minute walk card for Central Park python fieldcard.py --lat 40.7678 --lon -73.9718 --minutes 90 --activity walk # → Writes fieldcard.html. Print it (A5). Put the phone away. # Or run the local web UI (no frameworks, no build step) python fieldcard.py serve --port 8000 # → Open http://localhost:8000, fill the form, print, go. The open-source AI part
The local open-weight model (default: llama3.2:3b via Ollama) writes only the words — the title, the mission paragraph, and the nine sensory prompts. It's given real facts: your season, the actual place names nearby, the activity, the species observed this month. It writes poetry grounded in your specific terrain.
The code handles everything safety-critical: sunset time (NOAA solar equations), turn-around time, reach radius, daylight warnings. These are never left to the model.
# The LLM writes the poetry. Code does the safety math. # Design rule: if Ollama is offline, the card still works. got = llm_copy(facts, places, fallback_copy) if not got: # Built-in seasonal sensory prompts kick in automatically copy = fallback_copy You can swap any open-weight model with --model gemma2:2b or --model qwen2.5:3b. No API key. No cloud. No subscription.
Why open-source AI made this possible
It runs offline. On the trail, in a park with patchy signal, or on a plane — the card generates regardless. A cloud API would break the moment you most need the card.
Location data never leaves your machine. Your coordinates go to Overpass (OpenStreetMap) and iNaturalist for real place data, but the AI reasoning about your location happens entirely on your own hardware.
You can swap, fine-tune, or inspect the model. The prompt is visible in the source. You could fine-tune on your own field journals. A closed model makes that impossible.
It costs nothing to run. A 3B model on a laptop. No metered tokens, no monthly bill.
Architecture
graph LR A[CLI / Web Form] --> B[build pipeline] B --> C[OpenStreetMap Overpass<br/>real nearby places] B --> D[iNaturalist API<br/>local species this month] B --> E[Open-Meteo<br/>live weather, no key] B --> F[NOAA solar equations<br/>sunset + turn-around] B --> G[Ollama local model<br/>llama3.2:3b default] C --> H[render_card] D --> H E --> H F --> H G --> H H --> I[A5 printable HTML] I --> J[Printer] J --> K[Outside] Design rule: every external source degrades gracefully. No OpenStreetMap? Dead-reckoning rule prints instead. No Ollama? Built-in seasonal bingo prompts. No iNaturalist? Card omits the species bar. The card always prints.
Activity modes
| Mode | What changes |
|---|---|
walk | Radial map at 4.5 km/h, sensory bingo |
run | Wider radius at 9 km/h, trail-focused prompts |
birding | Slower 2.5 km/h, species bar prominent, iNaturalist birds |
garden | No map, frost-date-aware planting advice from local crop database |
--group | Pace routes (conversational / steady / long) + QR code to meetup point |
The web UI: a doorway, not a dashboard
Running python fieldcard.py serve starts a local server (Python stdlib http.server — no frameworks, no npm, works offline). The form has:
- Streak counter — consecutive days you've gone outside
- Achievement badges — First Steps, 3-Day Streak, Week Explorer, Bird Watcher, Green Thumb
- Live weather — current conditions fetched from Open-Meteo (free, no key)
- Card history — last 5 cards you generated
- One button — Generate Field Card
Time at the screen: under 30 seconds.
Tech stack (all open-source)
- Python 3.9+ stdlib only — no pip install required for core
- Ollama — local LLM inference runtime
- llama3.2:3b (default) — swap to
gemma2:2b,qwen2.5:3b, or anything you have - OpenStreetMap / Overpass API — real nearby places, cached locally
- iNaturalist API — research-grade species observations
- Open-Meteo API — free weather, no key, no account
- NOAA solar equations — pure Python sunrise/sunset math
- 26 unit tests — geometry, solar, places, web server
I took it outside
I generated a birding card for a local park, printed it, and spent 45 minutes looking for the nine things on the bingo grid. The model had written: "A bird puffed into a ball against the wind" — and I found one within 10 minutes perched in an oak. The card stayed in my pocket for the whole walk. The phone didn't come out once.
That's the test that matters.
Why open innovation matters here
A closed-model version of Fieldcard would require an internet connection, bill you per card, and own your location history. The open-weight version runs on a 2019 MacBook, works in airplane mode, and costs nothing after the first ollama pull.
For something designed to get you away from your phone and into the world, that's not just a technical preference — it's the whole point.
Agent session transcript
DevRelay recorded our development transcript including the prompt iterations, offline-first fallback logic, solar calculation constraints, and streak engine:
Direct link: dev.to/agent_sessions/building-fieldcard-local-ai-printable-pocket-cards-streak-tracking-5bfmd9
Links
- GitHub: https://github.com/chourasiavinit9-dev/fieldcard
- Agent Session: https://dev.to/agent_sessions/building-fieldcard-local-ai-printable-pocket-cards-streak-tracking-5bfmd9
- Try it:
git clone https://github.com/chourasiavinit9-dev/fieldcard && ollama pull llama3.2:3b && python fieldcard.py --lat 40.7678 --lon -73.9718
Submitted to the Hacktoberfest Open-Source AI Challenge: Week 1 — Touch Grass theme.
Built during October 5–11, 2026. New project, built for this challenge.


