Cross-platform suite for GPS workflows (macOS · Windows · Linux). v0.3.3 — Beta.
Modules:
Grab the right version for your operating system:
| Platform | File | Link |
|---|---|---|
| macOS (Apple Silicon, M1 or newer) | ReisezoomGPSStudio-macos.dmg | https://s.reisezoom.com/gps-studio-mac |
| Windows (x64) | ReisezoomGPSStudio-windows-setup.exe | https://s.reisezoom.com/gps-studio-win |
| Linux (x64) | from source | see the Linux section below |
⚠️ macOS requires Apple Silicon (M1/M2/M3/…). Older Intel Macs are not supported — the app won't launch on them. To check whether you have an Apple Silicon Mac, look under → About This Mac: if it says "Chip: Apple M…", you're good; if it says "Processor: Intel", unfortunately not.
On macOS & Windows you don't need to install anything extra — ffmpeg and exiftool are bundled with the app. Linux runs directly from source (system packages + python app.py, see below).
.dmgThe app is signed and notarized by Apple — the old "unverified developer" block is gone. macOS shows the one-time "Really open?" prompt for every app downloaded from the web (even signed ones), and only the first time.
If macOS unexpectedly says "damaged and can't be opened" (e.g. after an incomplete download):
xattr -dr com.apple.quarantine "/Applications/Reisezoom GPS Studio.app"
ReisezoomGPSStudio-windows-setup.exeWant to be extra safe? The Windows version is not (yet) signed. If you like, you can check the downloaded .exe beforehand with a service like VirusTotal — the builds come from an automated GitHub pipeline with no manual intermediate steps.
Uninstall like any other Windows app: Control Panel → Apps & Features → Reisezoom GPS Studio → Uninstall.
There is no prebuilt binary for Linux — the map/render backend (pywebview) needs the system GTK/WebKit bindings, which can't be reliably packed into a single binary. Instead, the app runs directly from the (open) source code:
1. System packages (one-time — incl. ffmpeg + ExifTool for rendering & photo metadata):
# Fedora / RHEL
sudo dnf install git python3 python3-gobject gobject-introspection \
webkit2gtk4.1 python3-cairo ffmpeg perl-Image-ExifTool
# Debian / Ubuntu
sudo apt install git python3 python3-venv python3-gi python3-gi-cairo \
gir1.2-webkit2-4.1 libwebkit2gtk-4.1-0 ffmpeg libimage-exiftool-perl
# Arch
sudo pacman -S git python python-gobject webkit2gtk-4.1 ffmpeg perl-image-exiftool
2. Get the repo & start:
git clone https://github.com/docarzt123/reisezoom-gps-studio.git
cd reisezoom-gps-studio
python3 -m venv --system-site-packages .venv # --system-site-packages → the venv can see the system GTK (gi)
source .venv/bin/activate
pip install -r requirements.txt
python app.py
On the first render the app downloads Chromium once (~150 MB).
Without ExifTool, JPEG, TIFF and HEIC photos still work (via piexif + pillow-heif, both built in). Only RAW files (CR3, NEF, ARW, RAF, RW2, ORF, DNG, PEF, RWL, SRW) and video metadata need exiftool, as does writing GPS into HEIC.
Animator + Tour-Map need a free Mapbox token for the 3D maps. The Geotagger works without one too.
On the first app launch an onboarding modal opens automatically with two options:
Here's how to get a free Mapbox token:
pk.eyJ…⚠️ Credit card required: since mid-2026 Mapbox requires a credit card at sign-up — even for the free account. It sounds odd at first, but it has become common with many cloud services. Nothing is charged as long as you stay in the free tier.
💡 Free tier: 50,000 map loads per month — free. In practice that's enough for a great many renders. With normal hobby use you'll never see a bill — you'd have to produce really intensively to hit the limit.
Change the token later: macOS menu → Reisezoom → Settings… (or Cmd+,) — Windows/Linux: ⚙ button, top right.
The app starts automatically in the system language (German, English or Spanish — fallback English). Switch it in the ⚙ Settings modal → language dropdown. Active immediately, no restart needed.
In the ⚙ Settings modal there's a "Quality & Export" block — it applies globally to the Animator video export:
The alpha mode ("Without map" in the Animator) automatically uses lossless PNG frames and ProRes 4444 — you don't need to set that up separately here.
Settings file:
~/Library/Application Support/Reisezoom GPS Studio/settings.json%APPDATA%\Reisezoom GPS Studio\settings.json~/.local/share/Reisezoom GPS Studio/settings.jsonSessions are track-bound: every GPX track automatically gets its own session (recognized via a hash of the track coordinates). Load the same track a second time and you get all previously made settings + keyframes back — no more "lost" state when switching modules.
Projects are variants within a session — e.g. "Standard variant" + "portrait reels" + "with photo inserts". You can create any number of projects per track.
Where do I find this? Top bar, top right — a project dropdown with 4 actions:
The session data lives under:
~/Library/Application Support/Reisezoom GPS Studio/sessions/(One folder per track hash, with a GPX snapshot + projects.json holding all variants.)
You don't need to have a GPX. Just open (via the GPX bar or by drag & drop) any of these formats — the app converts it to a GPX automatically on load and works from there:
| Format | Extension | Typically comes from |
|---|---|---|
| GPX | .gpx | almost all apps (Komoot, Strava, Garmin Connect, …) |
| FIT | .fit | Garmin, Wahoo, Coros, Suunto, Strava (bike computers & sport watches) |
| NMEA 0183 | .nmea / .log | Canon EOS 6D, marine GPS, GPS loggers |
| KML / KMZ | .kml / .kmz | Google Earth, Google My Maps |
| TCX | .tcx | Garmin Training Center, Strava export |
| GeoJSON | .geojson | web / OSM tools |
Elevations and timestamps are carried over — as far as the format contains them — which matters for geotagging and the speed readout.
Export as GPX: Via the menu Reisezoom → "Export as GPX…" you save the currently loaded track as a real .gpx file — even if it came from another format. Handy when, for example, you need a clean GPX out of a camera .log.
Export as CSV: Via Reisezoom → "Export as CSV…" you get the same track as a table (index,lat,lon,ele,time, time as ISO-UTC). Ideal for spreadsheets, your own analyses, or importing into other tools.
Note: A.jsonis only recognized if it looks like a GeoJSON track; a.txtonly if it contains real NMEA sentences ($GP…).
Loads a GPX file and renders an MP4 in which the track line is animated, drawn over a 3D Mapbox map. Use it for: YouTube video intros, website loops, memory animations.
Current frame as an image (snapshot, since v0.9.412): Below the render button sits "📸 Current frame as image". Scrub the preview to a nice spot and click the button — exactly this frame (track up to the current position, your camera framing, the overlays of the moment) is saved as a full-resolution image. Perfect for thumbnails or a still from a running flyover.
Open as Tour-Map (since v0.9.412): The button "🗺 Open as Tour-Map" switches to the Tour-Map and takes over exactly your current framing (position, zoom, rotation, tilt) — instead of fitting the whole route as it normally would. There you can render the still as a PNG; it keeps the adopted viewpoint. (For an interactive map for the web, there's the dedicated "🌐 Web Map" module.) With the ⤢ button (bottom right on the map) you jump back to the full view.
<GPX name>_<WxH>_<codec>.mp4Animate the journey / a route? Since v0.9.205 there's a dedicated 🛣 Travel Route module for that (start/destination → calculated route). See chapter 4.
↩︎ Undo for everything (since v0.9.322): Every settings change can be undone with ⌘Z (Mac) / Ctrl+Z (Windows) — in Animator, Tour-Map, Geotagger and Elevation Animator: colors, font, line width, glow, overlay fields, keyframes, trim, time offset, etc. Redo with ⌘⇧Z / Ctrl+Y. (One slider drag = one step.)
Map:
This works identically in the preview and the finished video. (For photo cards this happens automatically via the photo's capture time.)
Overlays (all individually toggleable, freely placeable):
🆕 Stats editor (since v0.9.321): you choose what's shown — and in what order. Below the Totals and the Live box there's a field list each. Checking/unchecking determines what appears; with the ⠿ handle you drag the fields into the order you want. Selectable values:
GRD_PCT or NGP readable, rename "cadence" to "step rate / spm" for running, or specify speed in "knots" for sailing. "Reset" restores the default.🎨 Appearance of the stats boxes (since v0.9.321): at the bottom of the Overlays section you choose font (System, Nunito, Quicksand, Fredoka, Oswald, Bebas Neue), text color, background color and background opacity — applies to all boxes, with a live preview on the map.
Positions (since v0.9.284): stats boxes in a 3×3 grid — four corners plus top (↥), bottom (↧), left (⇤), right (⇥) centered and center (✛) (e.g. for a title/opening overlay). The elevation profile is narrower and additionally offers top wide / bottom wide (across the full width).
⏱ Time window per box (since v0.9.228): Under each overlay box you can set from which and up to which video second it's shown — e.g. show the Live box only from second 2, or hide the Totals box again after second 8. Two fields "from … s" / "to … s", counted over the whole video (intro + animation + hold). Empty or 0 = as before (visible the whole time). You can see the fade in/out already in the test run, before you render.
Camera:
Time & size:
Performance & output (since v0.4):
ℹ️ Render time depends much more on duration × FPS × resolution than on the number of points. If a render takes too long: reduce FPS/resolution first.
.mov file** (ProRes 4444 with an alpha channel, larger than MP4 but NLE-ready).Manual map position (WYSIWYG): You can pan the preview map with the mouse (click+drag) and zoom with the scroll wheel. The render adopts your position 1:1 — what you see in the preview is what comes out in the video.
If you want the track centered again: the ⤢ button at the bottom right.
Since v0.8.16 this is an optional pro feature. Default for new projects: just a "🎥 Keyframe editor" checkbox in the sidebar. Only when enabled: the timeline bar appears under the map, the detail editor becomes accessible in the sidebar, and map pins are drawn. Existing projects with keyframes are enabled automatically.
With the timeline bar below the map preview you can shape the camera flow dynamically — freely set tilt, rotation and zoom at any points in the track. The engine interpolates cleanly between the keyframes (just like in Premiere or Final Cut).
Anatomy of the bar:
Point 234 / 1500 · 15.6 % plus a mode indicator:🎥 on keyframe #2 — the detail editor in the sidebar is activefree (📍 = new keyframe) — the map is freely manipulable, without changing keyframes⏸ Hold — the scrubber is in the hold phase, the track endpoint standsSnapshot workflow (the core):
Free mode vs. edit mode:
Test run: The ▶ button plays the whole track in your actual animation duration (so if you set 12 s, the test takes 12 s). A second click (or Space) stops it immediately. A pure preview feature, no render needed.
Keyboard navigation (like in an NLE):
| Key | Action |
|---|---|
| ← / → | one GPS point forward/back |
| ⇧ + ←/→ | jump of 10 |
| Home / End | track start / end |
| Space | start/stop test run |
| Del / Backspace | delete the selected keyframe |
Works only when no slider/input currently has focus. If you've just adjusted a slider and the arrow keys don't respond → click the map once.
Deleting a keyframe works in 4 ways:
Timeline anchor (since v0.8.11): The keyframes hang on a position on the entire timeline (animation + hold), in the range 0..100 %. With e.g. 12 s animation + 5 s hold, the track end sits at ~70.6 % — keyframes before it move with the track, keyframes after it move only the camera (the track endpoint stands still).
That's how "zoom out to the whole route at the end" works, for instance: a keyframe at the start zooms to the starting point, a keyframe at the track end zooms back to normal, a keyframe far back in the hold phase zooms out to the whole route → a cinematic outro.
Fallback to classic behavior: If no keyframes are set, everything runs as before v0.7 — static pitch (from the sidebar slider) + a linear bearing sweep (from the rotation slider). As soon as you set the first keyframe, the two sidebar sliders get a yellow note "⏱ Controlled by timeline keyframes" and become visually secondary. "🗑 Clear all" makes them the primary control again.
If you want to show the whole globe at the start and have it spin one or more times as you zoom into the track, that now runs — exactly like on the Insta360 — directly via the longitude of the map position. There's no separate "world rotation" track anymore; the rotation is baked into the longitude value itself.
How it works: Each keyframe has two new fields in the editor, Lon (longitude) and Lat (latitude) — a slider plus a click-editable number field, just like pitch/rotation/zoom. The longitude is unwrapped: values above ±180° mean full Earth rotations on the way from the previous keyframe.
10 and at the next KF 370 → the Earth spins once completely and lands back at longitude 10.10 → 730 → two full rotations, then landing at 10.10 → 380 → one rotation plus 10° eastward.Workflow for "the Earth spins, then zoom in":
The Earth spins evenly between the two KFs and ends up exactly at the track — the zoom/pan flight stays clean (no "wild flight"), because the full rotations are computed separately from the flight curve.
When you drag the map, the value counts up automatically: if you rotate the Earth with the mouse past the date line, the longitude doesn't snap back to −180° but keeps counting (181°, 182°, … 370°, …). Just make as many rotations as you want and then press the snapshot button — the value is taken over with all the rotations.
Slider tricks:
1090 for 3 rotations) are also allowed370° (1↻), 730° (2↻)Note for old projects: Projects from earlier versions with the old "world rotation" track still load, but the old rotation track is ignored. Set the rotation anew via the longitude if needed.
Sometimes you only want to render a section of the track instead of the whole route. Example: a 30 km tour, but you only want the mountain section as a video.
In the timeline bar you'll find two sliders with a gray handle — the left and right trim handles. Drag them inward to shorten the render range. The selected range is highlighted in light orange; the grayed-out areas remain on the left/right.
Three input fields in the "Time & size" block control how long your render video runs:
| Field | What happens |
|---|---|
| Intro | seconds BEFORE the track starts. The marker sits at the left trim handle, camera keyframes run → for setup shots (e.g. globe → route-start zoom) |
| Animation | seconds in which the track is traced |
| Hold | seconds AFTER the track ends. The marker sits at the right trim handle, camera keyframes run → for an outro (e.g. "zoom out to the whole route") |
The timeline visualizes this in three zones:
Default values: Intro 0 / Animation 12 / Hold 5. So a 17-second output video in total.
When you render only part of the track, you can choose whether the track line before it stays visible (as a faint background line for orientation) or whether the line only starts at the left trim handle. A checkbox in the overlay settings modal ("🧭 Stats from the trim range" / "🧭 Show track before the trim start"). On by default.
During the render you see the frame currently being produced in the preview window. If the combination of style and camera angle doesn't suit you: click "⨯ Cancel" — the half-finished file is deleted immediately and you can reconfigure without having waited 5 min for a render that turns out to be nothing.
Photos with GPS EXIF appear as small thumbnails at their capture position. Perfect for travel vlogs: the track runs along, and the photo points are visible as polaroids on the map.
Workflow:
List in the sidebar: shows each photo with a thumbnail + filename + coordinates. A click flies the map to the photo.
Shared between Animator and Tour-Map: The photo list lives at the project level. What you load in the Animator is instantly on the Tour-Map too (and vice versa). The size is separate per module — the video can have smaller pins than the print map.
Persistence: paths + GPS coordinates are stored in the project. On the next opening the thumbnails are regenerated automatically (disk cache, hence fast). If you moved or deleted a photo file in the meantime, it quietly drops out of the list — no crash.
In the render: photo pins appear as soon as the animated marker reaches their position (since v0.9.187 — before that they were accidentally visible from the first frame), and then stay until the end. The position is exactly the EXIF GPS position (even if it's not on the track, e.g. a summit photo next to the hiking trail).
Animates the journey to a tour: you enter a start and destination, from which a route is calculated and animated like a track — e.g. as an intro before the actual hiking video. The loaded GPX (the hike) is shown as a ghost in the background.
Travel Route is a full-fledged clone of the Animator: everything that works there (map style, keyframes, signs, render options) works here just the same — only, instead of a GPX, the calculated route is animated. Its own settings and its own signs (independent of the Animator).
lat,lon. "➕ Waypoint" inserts a station before the destination; ✕ removes one. With "📍 Click mode" you simply click the stations one after another on the map — each click appears as a new station in the list (Esc ends it). Handy when the real route (e.g. a ferry) doesn't follow the direct path.The detail level takes effect only at the next "Calculate route" — move the slider, then recalculate.
The "👻 GPX ghost" area: show on/off, color, opacity, line width, dashed. Takes effect live in the preview and in the rendered video. (In the Travel Route module the stats overlays are hidden for this.)
All stations (start, waypoints, destination), style, detail level, profile and the last calculated route are stored in the project — after a restart everything is back (the route appears without recalculating).
Road routes + address search run via Mapbox (the same token as the map, see Getting Started). The flight path (great circle) needs no API call.
Like the Animator, but a single image instead of a video. Output: a PNG in any resolution. Use it for: YouTube thumbnails, Instagram posts, blog covers, Komoot gallery images.
The Tour-Map is the same interface as the Animator — just in still-image mode: everything that only makes sense for a moving video (timeline, keyframes, live stats, trim, camera flight, FPS/duration) is hidden. What you see on the map is exactly the rendered PNG (WYSIWYG).
In the Camera section there are three controls that only appear in still-image mode — all take effect instantly, live in the preview:
Plus, as in the Animator: tilt (pitch) and zoom level. The "Image settings" section now only contains the resolution.
After the render: a large preview image, "Show in Finder", "Copy path", "New map".
In the map style dropdown, the Tour-Map module offers, in addition to the Mapbox styles (Satellite, Streets …), four OpenStreetMap styles to choose from: OSM Standard, OpenTopoMap, CyclOSM, Humanitarian — and that's even if you have a Mapbox token stored. If you pick an OSM style, the preview shows it immediately. (OSM styles need no token.)
An interactive map for the web? The Tour-Map produces a still image (PNG). If you need a zoomable/pannable map for your blog, use the dedicated "🌐 Web Map" module (since v0.9.422) — see section 5c.
A dedicated, deliberately lean tab for interactive maps for the web/blog — completely separate from the Tour-Map. The track is drawn automatically from the loaded GPX, and you add text labels directly onto the map. The result is a light, standalone HTML file (~40 KB) with a token-free OpenStreetMap map — to zoom and pan in the browser, like the embedded maps in Reisezoom blog posts. The preview in the app is exactly the export.
(If instead you want a high-quality still image with satellite/3D/signs/photos, use the Tour-Map.)
You can show several GPX tracks on one map — e.g. multiple stages of a tour or the outbound and return legs. The first track comes from the loaded GPX (global GPX bar). Add more in the sidebar section "More tracks" via "+ Add track" and pick a GPX per file. For each track you set name, colour, width and start/finish pins; remove it again with 🗑. The map automatically fits to all tracks together, and the preview is, as always, exactly the export.
With the "GDPR consent button" checkbox the map gets a preceding consent layer — the external map tiles (and thus the IP transfer to OpenStreetMap) are loaded only after a click. The consent text and button label are freely editable and pre-filled sensibly. Behind the text lies a blurred preview image of your map, which is embedded firmly in the HTML (no external loading) — so the gate doesn't look empty and is still GDPR-compliant. (Exporting with active consent takes a few seconds longer, because the map is rendered once for it.)
In the export area you choose where the embedded map loads Leaflet from:
https://yourblog.com/leaflet/); the HTML loads leaflet.css + leaflet.js from there. You put the two files on your server yourself.<iframe> snippet for a WordPress "Custom HTML" block**. The entire map is inside the snippet (srcdoc) — no separate file upload needed..html on disk to upload to your own server.Deliberately minimal: only track + text labels. No photos, no sign graphics, no 3D/overlay — this is the light "blog map" export.
Builds a video from your track in which the elevation-profile curve builds up live — a moving marker shows elevation, gradient and distance. Ideal as an overlay in the edit (also with a transparent background via ProRes 4444 alpha).
Above the profile you show a value bar — toggle it on/off in the "Info bar" section and select it per field: distance, elevation gain ↑/↓, Ø gradient, max. gradient (↑/↓), elevation (max/min/Ø). In addition, the marker callout shows the current gradient (e.g. "↗ +6.2 %" / "↘ −4.7 %") next to elevation and distance — can be turned off via "Show gradient % at the marker".
In the "Points along the route" section you place labeled markers into the profile — from four sources, individually toggleable:
<wpt> POIs from the GPX file (e.g. from Komoot/Garmin) are taken over.Each point appears animated as soon as the line reaches it. You can hide/show individual points from a source in the list via 👁. Your manual points + all settings are stored per project.
Colors (since v0.9.395): In the "Look" section, alongside background and line color you now also choose the grid color (helper grid) and label color (axes, info bar, marker callout).
Smoothing (since v0.9.400): The "Smoothing" slider in the Look section (0–20) softens jagged profiles — helpful with tracks that have many GPS points and small elevation jumps. It applies a moving average over the elevation data; 0 = raw data, higher values = smoother. The smoothing takes effect WYSIWYG on everything: line, area, info bar, the gradient at the marker and the point elevations — the same in preview, video render and HTML export.
Area under the line (since v0.9.402): In the "Area under the line" section you set whether the area under the curve is filled, in which fill color and with what opacity (0–100 %). Below that you can create color zones by elevation: with "Add elevation" you define an elevation (in meters) plus a color — from this elevation up the fill color changes. This creates the classic relief-map look (e.g. green in the valley, brown at mid-altitudes, white at the summit). Below the lowest zone the normal fill color applies. Via color transition you choose between a soft gradient (the colors blend into each other) and hard bands (the color jumps at each elevation). Without zones, the fill color is simply used for the whole area.
Create elevation steps automatically (since v0.9.403): Instead of setting each zone by hand, you enter a number at "Number of steps" (e.g. 4) and click "Create steps" — the elevation range of your track is then automatically divided into that many equal-sized steps and given a terrain color ramp (green → brown → white). You can edit the generated steps as normal afterwards (change elevation/color, delete, add).
Elevation steps for background and line (since v0.9.403): The same elevation color zones are additionally available in the "Background elevation steps" and "Line elevation steps" sections. With them you color the background or the elevation line by altitude — each with the same generator, zone editor and soft/hard toggle. The base color is the respective base color from the Look section ("Background" or "Line color").
Point & info box separated (since v0.9.405): In the "Marker" section there are two independent switches: "Show point (draws the line)" controls the moving point at the tip of the animation, "Show info box" controls the info box beside it. That way you can, for example, turn the info box off entirely and still keep the point (or vice versa). The point color and point size above apply to the point.
Background only in the chart (since v0.9.404): In the "Background elevation steps" section there's the "Only in the chart area (inside the axes)" checkbox. When active, the elevation color gradient of the background is drawn only inside the axis frame (exactly where the elevation line and the area sit) — the border all around keeps the normal background color. Without the checkmark, the gradient colors the whole image as before.
Configure the marker (since v0.9.396): The dedicated "Marker" section makes the moving point and its info box fully customizable: point color + size; for the box background color + opacity, border color + border thickness, font size; and which values it contains — ⛰ symbol, elevation, gradient (%), distance each individually toggleable (the box adjusts its size automatically).
Undo: ⌘Z / Ctrl+Z undoes everything in the Elevation Animator — look, colors, info-bar fields, waypoints and source switches (one press per step).
Export as HTML (blog/web, since v0.9.397): Below the video render button sits "Export as HTML". This produces a **self-running .html file — the same animation as in the video, but it runs completely in the browser (pure HTML, no video), with an auto-loop and a "↻" replay button. Ideal for a blog post. After the export a window opens in the center of the screen** with these options:
<iframe> snippet — paste into a WordPress "Custom HTML" block**. The entire animation is inside the snippet (srcdoc), cleanly isolated from the theme..html on disk; upload it to your server and embed it via <iframe src="…">.No WordPress plugin needed; no Mapbox/CDN — the file runs on its own.
Settings are kept (since v0.9.399): colors, marker settings, resolution, duration, etc. are stored per project and restored on the next opening.
Since v0.9.331 the Geotagger comes in three variants:
1. In GPS Studio (this module) — together with Animator, Tour-Map & Co.
2. As a standalone solo app "Reisezoom Geotagger" — lean, just for tagging photos, with an OpenStreetMap map without a Mapbox token (no credit-card topic). Ideal if you only want to locate photos.
3. As a web tool in the browser — tags JPEG photos entirely locally (nothing is uploaded), no installation. For RAW/HEIC/video you need the desktop app.
All three use the same logic. The following workflow steps apply to the desktop variants (1 + 2).
Reads the capture time from the EXIF data of each photo and finds the matching track point in the GPX track. Writes the GPS coordinates as an EXIF tag into the photo. Works with JPG, RAW (CR3/NEF/ARW/RAF/RW2/ORF/DNG/PEF/RWL/SRW/HEIC) and video (MP4/MOV/INSV) (web tool: JPG only).
The app reads the OffsetTimeOriginal EXIF tag from each photo and converts the capture time to UTC. That way the track fits out of the box in 95 % of cases without you having to set an offset manually.
If it doesn't after all (e.g. because the camera clock was wrong):
Each camera's button shows its set offset as a small badge (e.g. 📷 OM-3 +1h). Without a camera filter ("All") you set the global default, which applies to all cameras without their own offset. The per-camera offsets stay saved and also take effect in the optional capture-time correction.
If your GPX track was recorded with the Reisezoom Logger app (Android), it contains the real camera view direction (compass, true north) per point. The Geotagger writes this as GPSImgDirection into the photo — so later, for example, Lightroom or Apple Photos knows which direction you were shooting (an arrow on the map).
You can set each photo's view direction directly on the map:
If two or more photos have (almost) exactly the same position, their map pins lie on top of each other and you only hit the topmost one on a click. Just click the pin — it fans the photos out in a circle (with small leader lines), then you click the one you want individually. Selecting one collapses it again automatically; a click on the empty map or a move/zoom also collapses it. (Alternatively you can reach every photo via the list on the left + the ↑/↓ arrow keys.)
Clicking a photo (in the list or on the map pin) opens the preview panel on the right with two tabs:
Edit fields directly (since v0.9.343, batched since v0.9.344): In the EXIF tab you can click and change any value — an input opens inline, Enter (or ✓) applies, Esc (or ✕) cancels. Emptying a field = the tag is deleted. Grayed-out fields (filename, file size, image dimensions, ExifTool version …) are inherently not editable because ExifTool doesn't write them. Tip: camera, lens, ISO, aperture, etc. are found as individually editable tags (Make, Model, LensModel, ISO, FNumber, ExposureTime) in the EXIF tab.
When is it saved? Your changes are not written immediately into the photo, but collected as pending (marked yellow, with a hint line + "discard") — in addition, a small yellow warning banner appears above the photos/map as long as unsaved changes are open. They're only written when you click "Write tags" at the bottom — together with GPS/address/direction and within the same ZIP backup. That way there's a backup before every change. The write button is active even if you only edited EXIF fields (without GPS).
On the Mac the Geotagger can automatically detect keywords for each photo — scenes and objects like "outdoor, forest, deer, beach". This is done by the built-in Apple Vision framework: completely on the device, no internet, no account, no download, and fast (a fraction of a second per photo). Common terms are translated into German.
Here's how: click the "🔍 Auto-tag (image recognition)" button in the write section → the app analyzes all visible/checked photos → the suggestions land as pending changes (yellow, in the Keywords field) → you skim/correct them in the EXIF tab and then write them with "Write tags" (incl. backup). The AI only suggests — you decide.
Windows / Linux: This function is not available there — Apple Vision is Mac-exclusive, and we didn't want to bundle a huge AI model for it. The button is simply hidden there; everything else in the Geotagger works identically.
Some fields you want to set once and write to all photos — name, copyright, etc. For that there's the "✎ Global fields (creator, copyright …)" button in the write section. In the form you enter what you need:
These values are stored as a profile — you type name + copyright once, and after that they're already there for every batch. On "Write tags" they're written to all visible/checked photos, and per field into several metadata tags at once (EXIF + IPTC + XMP) so that Lightroom, Apple Photos & Co. find them everywhere. If you changed the same value by hand for a photo in the EXIF tab, your individual change takes precedence over the global value. Emptying a field in the form = it's no longer written.
As soon as photos are assigned, the app automatically determines the complete address (street, town, state, country) for each and shows it in the photo popup. On tagging it's written into the photo as IPTC + XMP — Lightroom, Apple Photos & Co. then show the location and country. The "📍 Fetch addresses" button is now only for re-fetching.
In the write section you can specify per run what goes into the photo: GPS coordinates (always), elevation, view direction and address — each option individually toggleable. The selection is remembered.
Click the track line on the map → a small popup shows the GPS coordinates, elevation and date/time (UTC) of the nearest track spot. Handy for quickly checking when/where you were at a spot.
The "Overview" in the left panel counts how many photos will be tagged, lie outside the track time, have no usable EXIF time, or already had GPS. Behind each line sits a "show" button: a click filters the photo list to exactly this category (e.g. only those outside the time, to check them). "Reset filter" brings all photos back.
Some photos can't be assigned by time — e.g. because they only carry the export date and thus land "outside the track time". Instead of giving up on them, just drag them from the photo list onto the map — where you release, the GPS coordinates are set and written.
DateTimeOriginal) into the photo for snapped photos. Perfect for WhatsApp photos from friends that only have a wrong forwarding time — so after tagging they sort correctly among your own photos. Applies only to snapped photos; time-matched photos keep their original time. The track time (UTC) is converted to your local time zone — correct if you were traveling in your home time zone.Note: manual placements apply to the running session. If you switch modules and come back, you may have to set them anew.
ExifTool runs as a daemon in the background — RAW processing is ~8× faster than a naive subprocess call. Tagging 200 photos takes ~15 seconds.
Shows every single point of your track on the map (the full raw track, not the smoothed preview downsample) and lets you repair broken spots: smooth GPS outliers, fill gaps, move or delete individual points. Needs no Mapbox token (works in OSM mode too). Saves as a new file <name>_geheilt.gpx — your original stays untouched. Opens all importable formats (GPX, FIT, KML/KMZ, TCX, GeoJSON, NMEA/.LOG) — foreign formats are converted to GPX automatically (since v0.9.296).
❤️ FIT/TCX sensors are preserved (since v0.9.334): If you edit a track with sensor data (heart rate, temperature, cadence …), the healed GPX keeps these values. Unchanged and smoothed points carry their real readings on, newly inserted gap points are interpolated. So you can use the healed track afterwards as normal in the Animator with a sensor overlay.
💾 "Save as…" + format (since v0.9.335): On saving, a file dialog opens — the default folder is that of your original file (no longer a hidden system folder). Choose GPX (sensors sit in the file directly via gpxtpx) or TCX (Garmin format with heart rate/cadence). That keeps the file portable and it doesn't lose standard sensors even outside Reisezoom.
Heal (smooth a jump) — for GPS zigzags: a point sits briefly far off (a tunnel, an urban canyon). Click anchor A (green, before the jump) and anchor B (red, after it), then 🩹 Heal. The points in between are laid onto the direct line — position and elevation interpolated, the timestamps stay unchanged. That way the speed corrects itself (previously e.g. "180 km/h on foot").
Fill a gap (straight line) — when points are missing between A and B: inserts new points on the straight line (position, elevation and time interpolated). The spacing is adjustable via "Spacing when filling".
Draw & fill a path — like "Fill a gap", but you draw the path yourself: choose anchors A+B → ✏️ Draw & fill a path → click on the map (the cursor becomes a crosshair) → ✓ Apply path. The gap is filled along the line you drew.
Individual points: click a point (anchor A only) → 🗑 Delete this point or simply Del/Backspace. Or move the green point with the mouse — e.g. drag it onto the real path without deleting it (time + elevation stay, speed still fits).
Trim the start or end (since v0.9.320): click a point (anchor A only) → ⏮ Trim everything before (the point becomes the new start) or ⏭ Trim everything after (the point becomes the new end). Just the thing when at the end of a tour you forgot to stop the recording and the track has a pointless tail (the drive home / standing still) — or when the approach at the start should go. ⌘Z undoes it.
Point info / timestamp (since v0.9.263): As soon as you click a point (anchor A), the selection line shows its index, the time (local) and the elevation. If you set A and B, it additionally shows the duration between the two points — handy for seeing how much time lies on a segment.
🛣 Match to road/path (map matching, since v0.9.263): Lays a noisy GPS trace cleanly onto the path network (smooths drift along paths/roads). Choose a profile (On foot / Bicycle / Car), then:
With the search radius (5–50 m, slider) you set how far a point may be from the path to still be snapped: small = only very close to the path, large = catches more GPS drift, but can rather jump onto a parallel road. The position is snapped, time and elevation are distributed over the new length, everything is undoable (⌘Z). Long tracks are automatically split into pieces (Mapbox limit). If the app finds no path within the radius, nothing happens and you get a clear message. Important: only sensible if the track actually follows paths/roads — for cross-country hikes it can distort the trace. Needs internet + a Mapbox token.
Instead of searching by hand: 🩹 Auto-heal scans the whole track and shows as a preview on the map what it would do — before anything is changed:
With ‹ / Next › you jump through the outliers, 🩹 Heal all applies both at once. The sensitivity slider (1–10) sets how strictly it searches (low = only glaring jumps/large gaps, high = also small ones), the fill spacing determines how densely gaps are filled — both update the preview live. Everything can be undone with ⌘Z.
Fill gaps as (profile): Straight line = a straight connection (safe, touches only the gap). Hiking/Bicycle/Car = finds the real route on the path network (Mapbox). ⚠️ Protection since v0.9.315: If the road route results in a big detour/loop (at junctions Mapbox sometimes routes via an exit + roundabout back), it's automatically discarded and the gap filled straight — so a clean trace is no longer bent. The toast then says "… detours discarded".
Cut out a loop/detour: if you have a spot in the track that runs out and back (e.g. an old healing detour or a real turnaround you don't want in the video): under "Edit manually (A→B)" set anchor A before and anchor B after the spot, then ✂️ Cut out the points between A→B. A and B remain, the line connects them directly. (⌘Z undoes it.)
"Snap the whole track to the path network" lays the complete track onto Mapbox roads and overwrites your points — this can create detours/loops at junctions. Hence, since v0.9.315, with a warning + 2-click confirmation. For just gaps/outliers, rather use the normal Heal.
GPS elevation values are often noisy — especially with poor reception the elevation jumps a few meters back and forth, and in the end there are far too many elevation meters in the stats (e.g. 1800 instead of 1400). Here you can blend the smooth terrain elevation from the Mapbox map (digital elevation model) with your GPS elevation — and see exactly what happens:
Needs a Mapbox token (settings) and internet — without a token the "Load" button is grayed out. Applying can be undone with ⌘Z. If you change points afterwards (delete/insert), the profile discards itself automatically — just reload it.
Zoom sync & clickable points (since v0.9.293): the map and the elevation profile are linked — zoom/pan the map and the profile automatically shows only the visible section; the mouse wheel over the profile zooms, dragging pans, and the map moves along each time. Cursor linked (since v0.9.294): if you move the mouse over the map, a vertical bar in the elevation profile shows where you currently are; if you move over the profile, a white ring appears on the track. That way you find spots in a flash, without clicking.
A single click on a point (map or profile) shows a small info field right at the point (without dimming the background) with all data (position, elevation GPS + map, time, distance, speed, gradient) and "As anchor A/B" buttons. Click another point and the field moves there. A double-click sets the anchor directly — the fast way to heal.
⌘Z undoes every edit, ⌘⇧Z redoes it (or the ↩︎/↪︎ buttons). When you load a new track, the history starts fresh.
💾 Save healed GPX writes <name>_geheilt.gpx and loads it directly as the active track — all modules use the clean version from then on.
At the top of the module header, right next to the GPX name, sits a red ✕ (tooltip "Clear workspace"). Click → a brief safety prompt → all loaded data gone, in all modules at once: GPX track, photos, markers, preview, match data — and the GPX name at the top disappears too. Handy when you edit several different tours one after another.
Since v0.9.155 there's just this one central ✕ instead of three separate "↺ Clear workspace" buttons per module. Before, the GPX name remained after clearing — that's now fixed.
What stays: the Mapbox token, all settings (style, pitch, color, etc.), the last used save folder.
The Animator and Tour-Map ask before the render where the output should land. A default name is suggested:
<GPX stem>_<WxH>_<codec>.mp4 e.g. Oderlandweg_1920x1080_h264.mp4<GPX stem>_<WxH>.png e.g. Oderlandweg_1920x1080.pngOn the next render the dialog lands in the same folder again. Cancel → no render runs (saves 5-15 min with the Animator).
You can:
Top left: the app icon + name. In the middle (when a GPX is loaded): stats pills (distance, time, ascent, descent). Top right: ? (help) and ⚙ (settings).
Clicking ? at the top right (or the macOS Help menu) opens a modal with five actions:
Clicking 📧 Feedback / bug report to Marc (or on a render error) opens a modal with:
marc@reisezoom.com with a copy buttonWhat you need to do:
[insert your text here] with a short description — what you did, what didn't workIf you have a local mail program (Mac Mail.app, Outlook Desktop, Thunderbird): the "📧 Open local mail program" button at the bottom left — then everything is pre-filled automatically.
On render errors an error modal opens automatically with an expandable log excerpt + "Show in Finder", "Open log", "📧 Send to Marc" buttons. You can find the full log file at any time at:
~/Library/Application Support/Reisezoom GPS Studio/logs/app.log%APPDATA%\Reisezoom GPS Studio\logs\app.log~/.local/share/Reisezoom GPS Studio/logs/app.logOn startup the app checks in the background whether a newer version is available on GitHub. If so, a subtle banner appears at the top, "New version vX.Y.Z is available", with a Download button (opens the matching Mac/Windows download in the browser). With the ✕ you dismiss the notice for this version. You can also click "Check for updates" at any time manually in the About dialog (Help → About). You install downloaded updates like the first setup (DMG/installer) — the app doesn't replace itself, for security reasons.
The app is not signed with a $99/year Apple Developer cert. Solution: right-click → Open instead of double-clicking (see Installation).
The same problem on Windows. "More info" → "Run anyway".
On the very first render the app downloads Chromium once for the map render pipeline (~150 MB). A modal appears with a progress indicator. After that, every further render starts right away.
Animator + Tour-Map need a Mapbox token (the Geotagger doesn't). Enter it in the ⚙ modal. If you want to try without one first: OSM mode (the standard map without satellite), but Animator rendering stays disabled.
Currently supported: CR3, CR2, NEF, ARW, RAF, RW2, ORF, DNG, PEF, RWL, SRW, HEIC, HEIF. If your format is missing: mail Marc, probably easy to add.
HEIC special: iPhone photos (HEIC) work out of the box since v0.9.57 — the necessary decoder plugin (pillow-heif with libheif) is in the app bundle, you need no separately installed tool. For the other RAW formats you still need ExifTool on the system (on macOS via brew install exiftool, on Windows the official standalone builds). If ExifTool is missing, the Geotagger sees this on photo import and skips the RAW files.
An Animator render at 4K with 30 fps × 17 sec = 510 frames. Per frame ~3-5 seconds with terrain enabled = ~30 min realistic for a 17-sec video.
Since v0.9.286, at 4K there's additionally supersampling (anti-shimmer): the image is computed larger internally and cleanly downscaled so that fine satellite detail doesn't shimmer during the pan. This makes 4K renders a bit slower, but noticeably calmer. 1080p is not affected — if you need speed and can do without the last polish, render in 1080p.
At the end, ffmpeg's +faststart phase takes another 2-3 min (the file size stays constant — this is not a hang, it's the Mapbox encoder finalizing).
Yes, in two tiers:
This was a known issue up to v0.9.286 and is now fixed (tile cross-fading turned off + supersampling + a slight map blur against the texture shimmer). If you still have an old video: just re-render it with the current version.
You control the strength via the "Smooth map" slider in the video settings (Animator). The default is a subtle value that removes the shimmer without making the map mushy. If the map is too soft for you → slider down (0 = off, sharpest map). If there's still shimmer → slider up. Takes effect only on 4K renders; statistics, numbers and the track line always stay sharp.
Probably a time-zone problem: the photo capture time doesn't match the GPX track time. Solution in the Geotagger:
Your most recently loaded GPX file is currently not readable — usually because the external drive was unplugged or the file was moved/deleted. Reconnect the drive (the banner disappears on the next load) or click "Choose file again" and pick the GPX anew. As long as the banner is up, the Tour-Map, Elevation Animator and Geotagger can't build the track.
Help → 📧 Feedback / bug report to Marc — everything pre-filled (see section 7).
| Shortcut | Action |
|---|---|
Cmd + , | Open settings |
Cmd + Q | Quit the app |
Cmd + M | Minimize the window |
Cmd + W | Close the window (the app keeps running in the background) |
| Shortcut | Action |
|---|---|
Cmd + Z | Undo the last action |
Cmd + Shift + Z | Redo |
Each module has its own undo stack with 50 steps:
When switching between projects, the undo stack of the affected module is cleared (there's no "undo" across project boundaries).
During a continuous drag (dragging a slider, moving a trim), one undo snapshot is stored per "edit session" (throttle 800 ms). Discrete actions like a KF snapshot or a checkbox click push immediately.
| Shortcut | Action |
|---|---|
← / → | 1 GPS point forward/back |
Shift + ← / → | 10 GPS points forward/back |
Home / End | track start / end |
Space | test run start/stop |
On Windows/Linux, Ctrl + … instead of Cmd + … accordingly, and Ctrl + Y additionally for redo.
The full roadmap is in the repo under docs/IDEAS.md.
marc@reisezoom.comHave fun rendering! 🚀