WanderLog: an offline field journal that answers "where did I see that kingfisher last time?" A developer built WanderLog, a local-first field journal implemented as a Model Context Protocol (MCP) server that turns 30-second voice memos into structured wildlife sightings and walks stored in SQLite. The system runs entirely offline using open-weight embeddings (all-MiniLM-L6-v2) via ONNX Runtime and Transformers.js, with a local gemma3:4b model through Ollama answering natural-language queries about past entries. In a field test, the journal correctly retrieved and cited a prior kingfisher sighting at Maota Lake, Amber, from a semantic rather than keyword search. I have a habit of seeing things outside and then losing them to my own memory. The peacock that called from the fog. The kingfisher that dove twice off the jetty and came up with a fish. The lizard big enough to hiss like a bicycle pump. So I built WanderLog — a local-first field journal that turns my coding agent into a naturalist's notebook. It's a Model Context Protocol MCP server. I go outside; when I get back I record a thirty-second voice memo of what I saw, and one command turns it into structured sightings and a walk. Everything else — remembering, finding, connecting — happens on my own machine, with open-source AI, with no network. Stack: TypeScript · MCP Model Context Protocol · SQLite · ONNX Runtime · Transformers.js https://huggingface.co/docs/transformers.js · open-weight embeddings all-MiniLM-L6-v2 · local gemma3:4b via Ollama · ElevenLabs Scribe optional · Sentry gen ai tracing Code: github.com/praneshnikhar/wanderlog https://github.com/praneshnikhar/wanderlog WanderLog is a field journal for the person who notices things outside and forgets them: the birder without a checklist, the hiker who wants to remember which trail had fog on the lake, the person who sees a peacock on the commute and wants to know whether it's the same one from last month. It's built around one rule: the screen should be the shortest part of the experience. There's no dashboard to maintain, no logbook to transcribe, no "curated profile of your nature observations." There's a walk, a thirty-second voice memo, and a question you can answer a month later. On the trail, you just talk to your phone like you're telling a friend what you saw. At home, one command: bash $ npm run log-voice -- ~/walk.m4a transcribing walk.m4a with ElevenLabs... transcript scribe v2, eng : "Saw a white-breasted kingfisher at the lake jetty. It dove twice and got a fish. Also spotted a rain lily on the path side, fresh after last night's rain. Walked the Central Park loop, three point two kilometers in fifty minutes. Fog on the lake." logged walk 1 a walk on Central Park loop, 3.2 km, 50 minutes, fog on the lake. Walked on 2026-10-08. logged sighting 1 bird white-breasted kingfisher, at lake jetty, dove twice and got a fish. Spotted on 2026-10-08. logged sighting 2 plant rain lily, at path side, fresh after last night's rain. Spotted on 2026-10-08. No typing, no forms. The memo became a walk, two sightings linked to that walk, and three searchable journal entries — and the spoken "three point two kilometers" became a real number. Then the journal answers questions about itself, from the same local model: bash $ WANDERLOG OLLAMA MODEL=gemma3:4b npm run demo "where did I see the kingfisher last time?" 1. 2026-10-03 sighting 10 — white-breasted kingfisher at Maota Lake, Amber score=0.465 semantic=0.500 keyword=0.186 Answer from local gemma3:4b: According to entry 1 2026-10-03 , the white-breasted kingfisher was last sighted at Maota Lake, Amber. The note specifically states "bird white-breasted kingfisher, at Maota Lake, Amber". It doesn't search for the word "kingfisher" — it searches for what the entry means . "Where did I see it last time" and "bird with the blue flash near the lake at golden hour" both land on the same entries, because the journal is understood by the same open-weight model that understands you. And the answer above was written by a 4B model on the same laptop: it cited the entry number, parsed the date, and got the place right. The full loop on a real walk — memo recorded on the trail, logged at home, question answered — was field-tested on Friday, October 9, and the video is below: Everything in the terminal sessions above is real output from the actual project, not mock-ups: the voice run is a real transcription of a real audio file, and the search output comes from the seeded journal. A local-first field journal for people who spend time outside. WanderLog is a Model Context Protocol MCP server that turns your coding agent into a naturalist's notebook. Log the birds, plants, and trails you see on a walk; later ask in plain language "where did I see the kingfisher last time?" — and get an answer computed entirely on your machine . Xenova/all-MiniLM-L6-v2 , Apache-2.0 executing in-process via gemma3:4b through MIT licensed, one npm test away from reproducible: a hermetic smoke test drives every tool over real MCP stdio, plus unit tests for the voice pipeline that stub both the ElevenLabs and Ollama calls. flowchart LR subgraph trail On the trail A Voice memo