README file from
GithubGeo Capture
Geo Capture is an Obsidian plugin for fast place capture in travel journals, trip logs, restaurant notes, and photo-based memories.
Positioning
Geo Capture is a note-first location capture plugin for Obsidian. It is built for travel journals, check-in logs, restaurant notes, sightseeing notes, and photo-based trip reviews.
It is not designed to replace a full map workspace. Its job is to help you insert useful place information into the note you are already writing.
Features
- Insert current device coordinates.
- Capture nearby place candidates with Google Places.
- Search places with OpenStreetMap Nominatim or Google Places.
- Use one quick insert flow for place names, coordinates, and map links.
- Parse map links or coordinates from the clipboard.
- Read EXIF GPS from nearby local JPG/JPEG images in the current note.
- Fall back to R2 Media Sync's local image metadata cache when the nearby image has already been rewritten to an R2 URL or the local attachment is unavailable.
- Cache photo GPS coordinates locally after a successful image lookup so repeated suggestions keep working if the local image is later moved, removed, or not yet synced on mobile.
- Insert photo-derived places at the current cursor or directly below the image.
- Fall back to manual place input when image GPS metadata is missing.
- Insert Markdown-friendly place snippets in compact, callout, table row, travel note, restaurant note, photo caption, or custom template formats.
- Generate Google Maps, Apple Maps, or OpenStreetMap links.
- Support multilingual UI with system language detection and manual language override.
Commands
-
Geo Capture: Search place and insertSearch by place name, paste a map link, or type coordinates. -
Geo Capture: Capture nearby placeGet current location and list nearby place candidates with Google Places. -
Geo Capture: Insert current locationInsert raw current device coordinates. -
Geo Capture: Insert location from clipboardParse coordinates or common map links from the clipboard. -
Geo Capture: Suggest place from nearest imageFind a nearby image in the current note, read JPG/JPEG EXIF GPS or R2 Media Sync metadata, and suggest nearby places.
Google Places Setup
Google Places is optional. To enable Google-powered search and nearby capture:
- Set
Place search providertoGoogle Places. - Enter a
Google Places API key. - Enable
Places API (New)in Google Cloud. - Adjust
Nearby search radius.
Geo Capture uses Places API New endpoints places:searchText and places:searchNearby, with a minimal FieldMask for required fields.
Localization
Geo Capture uses System as the default display language and follows the current Obsidian app language. You can also manually choose:
EnglishTraditional ChineseSimplified Chinese
Command names, settings, notices, search placeholders, and some default inserted labels are localized.
Image Insert Position
Image place insert position supports:
At current cursorBelow the image
When set to Below the image, Suggest place from nearest image inserts the selected place immediately below the detected image, which fits a photo-first travel journal layout.
Cloudflare Media Sync Workflow
Geo Capture is designed to pair with fab34/cloudflare-media-sync:
- Insert photos into an Obsidian note.
- R2 Media Sync reads available JPEG GPS coordinates before uploading and records them in its local
image_metadata.jsoncache. - Cloudflare Media Sync uploads the image to Cloudflare R2 and rewrites the image link.
- Let Geo Capture read local JPG/JPEG EXIF GPS, or fall back to the R2 Media Sync metadata cache when the note already contains an R2 URL.
- Select a nearby place or enter a place manually.
- Geo Capture writes durable location Markdown into the note.
The location annotation remains readable even after the local image link is replaced by an R2 URL.
Current Limitations
- EXIF GPS reading currently supports local JPG/JPEG files.
- R2 URL fallback depends on R2 Media Sync having captured GPS metadata before the image was uploaded.
- HEIC, PNG, WebP, and remote image URL metadata reading are not implemented yet.
- Many photos lose GPS metadata because of privacy settings, compression, social apps, or transfer workflows.
- Google Places requires an API key and may incur Google Maps Platform costs.
- Nearby search is available only when Google Places is selected and configured.
Privacy and Security
- Geo Capture does not include telemetry or analytics.
- Geo Capture does not upload note content or images.
- Network requests are made only when the user runs search, nearby-place, or photo-location commands.
- The optional Google Places API key is stored in local Obsidian plugin data and is only used for Google Places API requests.
- Photo EXIF GPS is read locally; coordinates are sent to Google only when Google Places is configured and used.
- Geo Capture stores a small local image GPS cache in its Obsidian plugin data after successful EXIF or metadata lookups. The cache contains image identifiers, coordinates, source path labels, and timestamps so repeated photo-location suggestions can work after a local attachment becomes unavailable.
- When Cloudflare Media Sync metadata fallback is used, Geo Capture reads
.obsidian/plugins/cloudflare-media-sync/image_metadata.jsonlocally and does not modify it.
See docs/security/security-review.md for the current security review.
Release Provenance
Geo Capture release assets now include GitHub artifact attestations.
Each published release can automatically generate provenance attestations for:
manifest.jsonmain.jsstyles.css
This helps users verify that release assets were built from the source repository through GitHub Actions.
Testing
See docs/testing/desktop-mobile-test-plan.md for the desktop and mobile test checklist.
Before release, run:
npm run check
Development
npm install
npm run dev
For local testing, symlink this folder into your vault:
ln -s /Users/fab34/Desktop/Git/GeoCapture /path/to/your/vault/.obsidian/plugins/geo-capture
Required Obsidian release files:
main.jsmanifest.jsonstyles.css
Published releases are available on GitHub: