A powerful, web-based GPX file editor for simplifying, editing, splitting, and joining GPS tracks. Perfect for cleaning up recorded tracks from apps like GeoTracker before sharing or analyzing.
🔗 Live App: https://asg49.github.io/GPXWeaver/
- Fast load for massive files (tested with 500,000+ points in 120MB+ GPX files - loads in several seconds)
- Smart lazy-loading - markers appear on-demand based on zoom level AND manual toggle
- Responsive zoom - even huge tracks feel snappy
- Handles extreme data efficiently without freezing
- Douglas-Peucker algorithm for intelligent point reduction
- Manual simplification at any percentage (1-95%) - NO auto-simplification
- Restore Original feature to undo simplification instantly
- User controls when and how much to simplify
- Perfect for compression without quality loss
- Respects marker visibility settings during simplification
- Manual toggle - Click "● Points ON/OFF" button (bottom-left) to show/hide markers
- Automatic lazy-loading - Markers auto-appear when zoomed in high enough
- Large files (5K+ points): Auto-load at zoom level 8+
- Medium files (1K-5K points): Auto-load at zoom level 9+
- Clean default - No markers on initial load (just blue track line)
- Red markers - Appear when shown, making them easy to spot
- Marker colors:
- 🔴 Red - Normal mode (markers enabled)
- 🟠 Orange - Split mode (indicates split is active)
- 🔴 Red - Delete mode (indicates delete is active)
- Visual point manipulation - drag points to adjust your route
- Add points - tap on the track line to insert new waypoints
- Delete points - long-press (2.6s) on any point (creates red X marks)
- Rectangle Selection - draw a rectangle to select and bulk-delete multiple points
- Real-time preview of all edits
- Works smoothly even with 12,000+ points visible
- Split mode - tap any point to divide your track into segments
- Red X marker appears at split point, auto-clears after save
- Save individual segments as separate GPX files
- Perfect for extracting specific portions of long recordings
- Split markers automatically cleaned up during operations
- Smart multi-file selection - select 2+ files = auto-join!
- Select 1 file = load normally; select multiple = automatically join
- Combine separate tracks into a single route
- Maintains all metadata and timestamps
- Prevent connector lines in joined tracks
- Gap threshold slider (10m - 1,000km on logarithmic scale)
- Automatically breaks lines at gaps larger than threshold
- Perfect for flight data and multi-segment recordings
- Adjust slider to hide/show connectors as needed
- OpenStreetMap
- OpenTopoMap (topographic contours for hiking)
- Google Satellite
- Google Terrain
- Google Hybrid (satellite + labels)
- Esri World Imagery
- Zoom level display - real-time zoom indicator (bottom-left on desktop, top-left on mobile)
- Scale bar - distance reference at current zoom (bottom-right)
- Fine zoom control (0.25 increments) - smooth, responsive zooming
- Zoom buttons: + and - for precise control
- Points toggle button - Show/hide markers on demand (bottom-left on desktop, top-right on mobile)
- No connector lines between separate
<trk>elements - Each track renders as independent segments
- Perfect for Google My Maps imports and complex GPX files
- Clean visualization even with dozens of tracks
- Responsive design for phones and tablets
- Touch-friendly controls
- Compact header (minimal screen waste)
- Works offline after first load
-
Load a GPX file
- Click the menu button (☰) in the top-right corner
- Tap "Load GPX File"
- Select your GPX file(s) from your device
- Multiple files? They automatically join!
-
View track points (markers)
- Initial load: You see only the blue track line (clean, minimal view)
- Show markers: Click the "● Points OFF" button (bottom-left) → changes to "● Points ON"
- Hide markers: Click the "● Points ON" button → changes to "● Points OFF"
- Auto-load: Zoom in high enough and markers appear automatically (even if toggle is OFF)
- Marker colors:
- 🔴 Red = Normal mode (points visible)
- 🟠 Orange = Split mode (track splitting)
- 🔴 Red = Delete mode (point deletion)
-
Edit your track
- Drag points: Touch and drag any red circle to adjust position
- Add points: Tap on the blue/red track line to insert waypoints
- Delete points: Long-press (2.6s) on any point (creates red X marker)
- Rectangle Select: Enable in menu → draw rectangle → delete selected group
- Change map: Use layer selector (top-right corner)
-
Simplify your track
- Open menu → Adjust simplification slider (1-95%)
- Click "Apply Simplification"
- Check the result
- Use "Restore Original" if you want to try a different percentage
- Note: Simplification respects your marker visibility setting
-
Manage gaps (joined tracks)
- Adjust "Gap Detection" slider (10m - 1,000km)
- Move up to hide connector lines between segments
- Move down to see all connections
- Works in real-time!
-
Save your work
- Click "Save GPX" button in the menu
- Browser's file picker lets you choose save location
- Files save with
_Xsuffix to indicate editing - Original files remain unchanged
- Click menu → Enable "✂️ Split Mode"
- Tap on any point where you want to split
- Red X appears at split point
- Click "Save GPX" when ready
- Get TWO separate GPX files automatically
- Red X clears after save
Method 1 (Automatic):
- Click menu → "Load GPX File"
- Select 2+ files at once (Ctrl+Click or Shift+Click)
- App automatically joins them!
Method 2 (Explicit):
- Click menu → "Load Multiple Files (auto-joins)"
- Select 2+ files
- Click "Join All Tracks"
- 500,000+ point file (120MB+)? Loads in several seconds with full responsiveness
- 12,000 points visible? Still responsive at high zoom
- Markers appear on-demand when you zoom in (level 8+) or toggle manually
- No performance penalty for massive tracks after initial load
- Input:
.gpxfiles (GPX 1.0 and 1.1) - Output:
.gpxfiles with all original metadata preserved - Multi-track: Properly handles
<trk>elements without connector lines - File System API: You choose where to save files
- Small tracks (<1,000 points): Instant
- Medium tracks (1K-50K points): <1 second load, markers on-demand
- Large tracks (50K-500K points): 2-5 seconds load, lazy markers
- Extreme tracks (500K+ points in 120MB+ files): Several seconds load, smart lazy-loading
- Optimized for all devices including older ones
- Start with clean view - Load track with markers OFF for clean blue line
- Toggle markers when needed - Click "● Points ON" only when you need to edit/inspect points
- Use high zoom to auto-load markers - Zoom in to level 8+ for instant marker loading
- Start conservative with simplification (5-10%) and increase as needed
- Use OpenTopoMap for hiking - shows elevation contours
- Adjust gap threshold based on your data type:
- Hiking: 100m-1km (tracks are continuous)
- GPS logs: 1km-10km (short gaps between session starts)
- Flight data: 10km+ (large gaps between flight segments)
- Check zoom level - display shows current zoom (bottom-left)
Default Behavior:
- Load file → No markers visible (just blue track)
- Provides clean, minimal interface by default
- Perfect for viewing long tracks without visual clutter
How to Show Markers:
- Manual toggle: Click "● Points OFF" button (bottom-left) to enable
- Auto-load: Zoom in high enough (level 8+ for large files, 9+ for medium)
- Both work: Markers stay visible if either condition is true
Marker Color Meanings:
- 🔴 Red circles: Normal mode (markers visible, edit points)
- 🟠 Orange circles: Split mode active (tap to split track)
- 🔴 Red X marks: Delete mode (long-press deletes points)
Cleaning a recorded hike:
- Load track (markers OFF by default)
- Click "● Points ON" to see all markers if needed
- Set slider to 10%
- Click "Apply Simplification"
- Review result with OpenTopoMap background
- Toggle markers OFF to see clean track
- Save as
_X.gpx
Joining multiple daily hikes into one trip:
- Load multiple GPX files at once (2+ = auto-join!)
- Adjust gap threshold (200m-1km) to break connector lines
- Review the joined track (markers OFF for clean view)
- Toggle markers ON if you need to inspect specific points
- Save as trip file
Extracting sections from a long track:
- Load track (markers OFF)
- Enable "✂️ Split Mode"
- Toggle "● Points ON" to see markers
- Tap points to split
- Save → get separate files for each section
Handling flight data (large gaps):
- Load multiple flight segments
- Set gap threshold slider to 4-5 (100km+)
- Toggle markers OFF for clean visualization
- No connector lines across flight segments
- Save joined file
Desktop:
- + / - buttons (top-left): Zoom in/out
- Layer control (top-right): Switch map backgrounds
- Zoom display + Points toggle (bottom-left): Current zoom and marker visibility
- Scale bar (bottom-right): Distance reference
- Menu (☰): All functions and settings
Mobile:
- + / - buttons (top-left): Zoom in/out
- Zoom display (top-left, below +/- buttons): Current zoom level
- Layer control (top-right): Switch map backgrounds
- Points toggle (top-right, below layers): Show/hide markers
- Scale bar (bottom-right): Distance reference
- Menu (☰): All functions and settings
- Chrome/Edge (recommended)
- Safari (iOS/macOS)
- Firefox
- Any modern browser with JavaScript enabled
- Algorithm: Douglas-Peucker line simplification
- Mapping: Leaflet.js 1.9.4
- Gap Detection: Logarithmic scale (10^x meters)
- Lazy Loading: Intelligent marker loading based on:
- Zoom level (8+ for 5K+ point files, 9+ for 1K-5K)
- User toggle (manual "Points ON/OFF" button)
- Markers appear when EITHER condition is true
- Marker Colors: Dynamic based on mode (Red normal, Orange split, Red delete)
- No server required: Runs entirely in your browser
- Privacy: All processing happens locally - no data uploaded
- File System API: Native browser file picker for save locations
- Error Handling: Robust cleanup of split/deletion markers on all operations
- Performance: Handles 500K+ point files (120MB+) with several-second load and responsive interaction
✅ Rectangle Selection Fixed (v5.94)
- Root cause found:
e.touchesis empty ontouchendevents (finger already lifted) rectEndPointwas returning undefined coordinates on mobile- Fixed by using
e.changedToucheswhich correctly captures the lifted finger - Bulk point selection and deletion now works reliably on mobile ✓
✅ Mobile Responsive Controls (v5.84-5.87)
- Separate mobile and desktop control layouts
- Desktop: Zoom + toggle together at bottom-left
- Mobile: Zoom at top-left, toggle at top-right, scale at bottom-right
- All controls now visible and non-overlapping on mobile ✓
✅ Marker Visibility
- Added Points toggle button for manual control
- Intelligent lazy-loading respects zoom levels
- Clean default (no markers on load)
✅ Code Quality
- Professional code audit (v5.75)
- Robust marker cleanup functions
- Error handling for malformed GPX files
- Extracted magic numbers to named constants
✅ Bug Fixes
- Fixed rectangle selection on mobile - changedTouches (v5.94)
- Fixed orphaned markers remaining after bulk delete (v5.92)
- Fixed mobile control overlap (v5.87)
- Fixed unconditional marker creation after simplification (v5.83)
- Fixed hardcoded red marker color (v5.81)
- Fixed marker persistence on file clear (v5.76)
- Fixed markers reappearing after zoom (v5.77)
- Fixed split/deletion marker cleanup (v5.78-v5.80)
✅ User Experience
- Rectangle Select works on mobile and desktop ✓
- Marker colors indicate mode (orange for split, red for normal/delete)
- No unwanted red markers appearing unexpectedly
- Simplification respects marker visibility settings
- Toggle button works reliably across all operations
- Mobile and desktop layouts optimized for each screen size
- ROOT CAUSE FIX: Rectangle selection finally works on mobile
e.touchesis empty ontouchend(finger already lifted) → was returning undefined coordinates- Fixed
getEventPoint()to usee.changedToucheswhich correctly captures lifted finger rectEndPointnow has valid coordinates → bounds calculation works → points selected ✓- Also fixed
clearMarkers()to always remove markers even whenforceShowMarkers=true - Orphaned red markers no longer remain after bulk deletion ✓
- Added extensive diagnostic console logging to rectangle selection
- Defensive null checks and error handling throughout selection code
- Fixed
clearMarkers()returning early whenforceShowMarkers=true - Old markers were not being removed from map after deletion
- Enhanced debug logging for rectangle selection bounds
- Switched rectangle selection to use
containerPointToLatLng()for lat/lng-based detection
- Changed rectangle selection from
markersarray totrackpointsarray iteration
- Rectangle selection coordinate system investigation
- MOBILE FIX: Controls repositioned for mobile devices
- Zoom display at top-left, Points toggle at top-right, scale at bottom-right
- All controls now visible and non-overlapping on mobile ✓
- Desktop layout unchanged (zoom + toggle together at bottom-left)
- Initial mobile control repositioning attempt
- Zoom moved to top-left to separate from toggle
- MOBILE: Toggle button as separate Leaflet control
- Bypass Leaflet wrapper issues that were hiding controls
- Added aggressive mobile CSS for bottom controls
- Force visibility and display properties for mobile
- CRITICAL: Fixed unconditional marker creation after simplification
- applySimplify() and restoreOriginal() now respect visibility settings
- Markers only appear when user toggles ON or zoom is high enough
- Tested with 120MB+ files - no unwanted red markers!
- Changed default marker color back to RED (visible indicator)
- Markers appear only on toggle or at high zoom (lazy-load)
- Design: Blue line always, red markers on-demand
- CRITICAL: Fixed hardcoded red marker color in createMarker()
- Markers now use dynamic color based on mode
- Normal mode: RED, Split mode: ORANGE, Delete mode: RED
- Clear both split markers AND deletion markers before operations
- Added safety cleanup in zoom handler
- Fixed marker flicker during simplification
- Split marker cleanup moved outside setTimeout
- Clear split markers before simplification
- Prevents red X marks from appearing after simplification
- Fixed markers reappearing after zoom on cleared files
- Added explicit empty check in zoomend handler
- Fixed markers persisting after file clear
- Added forceClearMarkers() function
- Professional code audit completed
- Removed unused variables, extracted magic numbers to constants
- Added try-catch to parseGPX(), file size validation
- Added points visibility toggle button
- Fixed toggle button variable scoping bug
- Robust split marker cleanup, zoom handler safety checks
- MAJOR: Smart multi-file loading (2+ files = auto-join)
- MAJOR: Logarithmic gap threshold slider (10m - 1,000km)
- Fixed "kmm" typo in gap threshold display
- Gap detection works for ALL tracks (not just multi-track files)
- Auto-simplification REMOVED - user controls when to simplify
- Added "Restore Original" button for undo
- File System Access API for save location control
- Header and UI optimizations
- Logarithmic gap threshold slider implementation
- Automatic unit conversion (m/km) for display
- No connector lines in joined tracks via gap detection
- Gap threshold applies to all track rendering
- Smart multi-file loading (auto-join)
- Multi-select on load input
- Removed auto-simplification on load
- User controls simplification manually
- Restore Original button
- Emergency save button removed
- OpenTopoMap added to map layers
- Zoom level display + scale bar
- Lazy marker loading for large files
- Performance optimizations
- Multi-track rendering fixes
- Initial major release with core features
MIT License - see LICENSE file for details
Tony Gozdz © 2026
Battery R&D Engineer
Serious GPX Geek 🗺️
This is a personal project, but feedback is welcome! Open an issue on GitHub.
For issues or questions:
- Check the About section in the app menu for tips
- Open an issue on GitHub
- Include browser/device info and problem description
Made with ❤️ for outdoor enthusiasts, GPS data nerds, and anyone who records interesting tracks
Tested with files ranging from 100 points to 500,000+ points (120MB+ GPX files). Handles massive tracks efficiently. Rectangle selection, bulk deletion, track splitting and joining all work reliably on mobile and desktop.