{"id":283303,"date":"2026-02-23T12:58:20","date_gmt":"2026-02-23T12:58:20","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/mapthread\/"},"modified":"2026-02-25T09:23:20","modified_gmt":"2026-02-25T09:23:20","slug":"mapthread","status":"publish","type":"plugin","link":"https:\/\/pcd.wordpress.org\/plugins\/mapthread\/","author":20211343,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.6.1","stable_tag":"1.6.1","tested":"6.9.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Mapthread","header_author":"David Gilbert","header_description":"Interactive map-based storytelling for WordPress. Combine narratives with GPX tracks and waypoints.","assets_banners_color":"c2c9cc","last_updated":"2026-02-25 09:23:20","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/ko-fi.com\/randomwire","header_plugin_uri":"https:\/\/github.com\/randomwire\/Mapthread","header_author_uri":"https:\/\/randomwire.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":229,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","faq","changelog"],"tags":{"1.6.0":{"tag":"1.6.0","author":"randomwire","date":"2026-02-23 19:05:09"},"1.6.1":{"tag":"1.6.1","author":"randomwire","date":"2026-02-25 09:23:20"}},"upgrade_notice":{"1.6.1":"<p>GPX files with named waypoints can now be imported as Map Marker blocks in one click from the Map GPX block editor.<\/p>","1.6.0":"<p>First official release on the WordPress.org plugin directory.<\/p>","1.5.8":"<p>Adds source repository link to the plugin Description and prepends a source comment to all compiled JavaScript files to address WordPress.org review guidelines.<\/p>","1.5.7":"<p>Adds an elevation chart indicator that syncs with GPX track hover \u2014 hover over the track on the map to see your position and elevation on the chart.<\/p>","1.5.6":"<p>Addresses remaining WordPress.org review scanner issues: reformatted external services section with explicit Privacy Policy URLs for every service, separated third-party libraries, and added source code link in Description.<\/p>","1.5.5":"<p>Addresses WordPress.org plugin review feedback: enqueues settings JS properly, documents source code location, and adds explicit service URLs and terms\/privacy links for all external services.<\/p>","1.5.2":"<p>Addresses WordPress.org plugin review feedback: removes CDN dependency, updates block apiVersion to 3, and expands external service documentation.<\/p>","1.5.1":"<p>Fixes abrupt zoom jumps when scrolling between markers with different zoom levels in follow mode, and resolves a JS error in the elevation profile.<\/p>","1.5.0":"<p>New settings page! Configure additional map providers (Mapbox, Thunderforest, JawgMaps, Stadia Maps) under Settings &gt; Mapthread. Toggle free layers and choose from dozens of map styles.<\/p>","1.3.9":"<p>GPX files with routes (not just tracks) are now supported.<\/p>","1.3.8":"<p>Paste coordinates directly from Google Maps or Gaia GPS into a single field \u2014 no more splitting lat\/lng manually.<\/p>","1.3.7":"<p>Elevation gain\/loss readings are now much more accurate \u2014 fixes overcounting on noisy GPS data.<\/p>","1.3.6":"<p>Hiding the map on desktop now expands the article to full width \u2014 the restore tile floats in the corner without reserving space.<\/p>","1.3.5":"<p>Scroll the page without accidentally zooming the map \u2014 use Ctrl (or \u2318 on macOS) + scroll to zoom.<\/p>","1.3.4":"<p>New map dismiss button \u2014 collapse the map to a small tile and expand it again with one tap.<\/p>","1.3.3":"<p>Smoother map following \u2014 camera now completes its animation after scrolling stops.<\/p>","1.3.2":"<p>Bug fix for track drift when other map plugins are active on the same page.<\/p>","1.3.1":"<p>Bug fix for track alignment when other map plugins are active on the same page.<\/p>","1.3.0":"<p>New map viewing options! Switch between Street, Satellite, and Topographic map styles. Fullscreen mode for immersive viewing.<\/p>","1.2.0":"<p>Major update with elevation profiles, emoji markers, and UI improvements. All third-party services properly attributed.<\/p>","1.1.0":"<p>Adds address search and markers-only mode for enhanced flexibility.<\/p>","1.0.0":"<p>Initial release of Mapthread.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3467716,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3467716,"resolution":"256x256","location":"assets","locale":""},"icon.svg":{"filename":"icon.svg","revision":3467716,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3467716,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3467716,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":{"mapthread\/map-marker":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"mapthread\/map-marker","version":"0.1.0","title":"Map Marker","category":"media","icon":"location","description":"Mark a location on the map that corresponds to this point in your story.","keywords":["map","marker","waypoint","location","mapthread"],"textdomain":"mapthread","attributes":{"id":{"type":"string","default":""},"title":{"type":"string","default":""},"lat":{"type":"number","default":0},"lng":{"type":"number","default":0},"address":{"type":"string","default":""},"zoom":{"type":"integer","default":14},"emoji":{"type":"string","default":""}},"supports":{"html":false,"align":false,"customClassName":false},"editorScript":"file:..\/..\/..\/build\/blocks\/map-marker\/index.js","style":"file:..\/..\/..\/build\/blocks\/map-marker\/style-style.css"},"mapthread\/map-gpx":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"mapthread\/map-gpx","version":"0.1.0","title":"Map GPX","category":"media","icon":"location-alt","description":"Upload and display a GPX track on an interactive map.","keywords":["map","gpx","track","route","mapthread"],"textdomain":"mapthread","attributes":{"attachmentId":{"type":"integer","default":0},"fileName":{"type":"string","default":""},"gpxUrl":{"type":"string","default":""},"pointCount":{"type":"integer","default":0},"bounds":{"type":"object","default":{"north":0,"south":0,"east":0,"west":0}},"showProgressIndicator":{"type":"boolean","default":true},"showElevationProfile":{"type":"boolean","default":true},"defaultMapLayer":{"type":"string","default":"Street"},"allowGpxDownload":{"type":"boolean","default":false}},"supports":{"html":false,"align":false,"customClassName":false},"editorScript":"file:..\/..\/..\/build\/blocks\/map-gpx\/index.js","style":"file:..\/..\/..\/build\/blocks\/map-gpx\/style-style.css","render":"file:.\/render.php"}},"tagged_versions":["1.6.0","1.6.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3467716,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3467716,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3467716,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3467716,"resolution":"4","location":"assets","locale":""},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3467716,"resolution":"5","location":"assets","locale":""},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3467716,"resolution":"6","location":"assets","locale":""}},"screenshots":{"1":"Editor view - Map GPX block settings","2":"Editor view - Map Marker block settings","3":"Map desktop layout - Story on left, sticky map on right","4":"Map desktop layout - Additional map styles","5":"Mapthread settings - API keys for additional map providers","6":"Map mobile layout - Sticky map at top (hidden by default)"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[10682,16150,2909,10346,249],"plugin_category":[39,49],"plugin_contributors":[256450],"plugin_business_model":[],"class_list":["post-283303","plugin","type-plugin","status-publish","hentry","plugin_tags-gpx","plugin_tags-hiking","plugin_tags-map","plugin_tags-route","plugin_tags-travel","plugin_category-business","plugin_category-maps-and-location","plugin_contributors-randomwire","plugin_committers-randomwire"],"banners":{"banner":"https:\/\/ps.w.org\/mapthread\/assets\/banner-772x250.png?rev=3467716","banner_2x":"https:\/\/ps.w.org\/mapthread\/assets\/banner-1544x500.png?rev=3467716","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/mapthread\/assets\/icon.svg?rev=3467716","icon":"https:\/\/ps.w.org\/mapthread\/assets\/icon.svg?rev=3467716","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/mapthread\/assets\/screenshot-1.png?rev=3467716","caption":"Editor view - Map GPX block settings"},{"src":"https:\/\/ps.w.org\/mapthread\/assets\/screenshot-2.png?rev=3467716","caption":"Editor view - Map Marker block settings"},{"src":"https:\/\/ps.w.org\/mapthread\/assets\/screenshot-3.png?rev=3467716","caption":"Map desktop layout - Story on left, sticky map on right"},{"src":"https:\/\/ps.w.org\/mapthread\/assets\/screenshot-4.png?rev=3467716","caption":"Map desktop layout - Additional map styles"},{"src":"https:\/\/ps.w.org\/mapthread\/assets\/screenshot-5.png?rev=3467716","caption":"Mapthread settings - API keys for additional map providers"},{"src":"https:\/\/ps.w.org\/mapthread\/assets\/screenshot-6.png?rev=3467716","caption":"Map mobile layout - Sticky map at top (hidden by default)"}],"raw_content":"<!--section=description-->\n<p><strong>Mapthread<\/strong> brings your adventures to life with interactive, auto-following maps.<\/p>\n\n<p>Perfect for travel bloggers, hiking enthusiasts, and anyone who wants to tell location-based stories that engage readers.<\/p>\n\n<p>https:\/\/www.youtube.com\/watch?v=LBp_favwZVs<\/p>\n\n<h4>Storytelling<\/h4>\n\n<ul>\n<li>Map automatically follows your narrative as readers scroll<\/li>\n<li>Pauses when readers explore the map themselves, resumes when they scroll on<\/li>\n<li>Click any marker to jump to that part of the story text<\/li>\n<\/ul>\n\n<h4>Maps<\/h4>\n\n<ul>\n<li>Upload a GPX file from any hiking, cycling, or fitness app<\/li>\n<li>Elevation profile with distance and gain\/loss stats<\/li>\n<li>Street, Satellite, Topographic map styles plus more from other providers (with API keys)<\/li>\n<li>Fullscreen mode, layer switcher, and optional GPX download for readers<\/li>\n<\/ul>\n\n<h4>Markers<\/h4>\n\n<ul>\n<li>Place waypoints anywhere in your story with optional emoji pins<\/li>\n<li>Find locations by address or paste coordinates<\/li>\n<li>Import named waypoints directly from your GPX file as Map Marker blocks in one click<\/li>\n<li>Without a GPX file, markers are connected together using a straight line<\/li>\n<\/ul>\n\n<h4>Layout<\/h4>\n\n<ul>\n<li>Two-column desktop view: story on the left, sticky map on the right<\/li>\n<li>Mobile: map sticky at top (hidden by default)<\/li>\n<li>Readers can dismiss and restore the map at any time<\/li>\n<\/ul>\n\n<h4>Perfect For<\/h4>\n\n<ul>\n<li>Hiking and backpacking blogs<\/li>\n<li>Travel storytelling<\/li>\n<li>Cycling route documentation<\/li>\n<li>Race and event recaps<\/li>\n<li>Historical narratives with geographic context<\/li>\n<\/ul>\n\n<h4>How It Works<\/h4>\n\n<ol>\n<li>Create a post and add the <strong>Map GPX<\/strong> block<\/li>\n<li>Upload your GPX file from the media library<\/li>\n<li>If your GPX contains named waypoints, click <strong>Import as Map Markers<\/strong> to add them automatically \u2014 or insert <strong>Map Marker<\/strong> blocks manually at key points in your story<\/li>\n<li>Add coordinates and titles to any markers, then arrange them in your story<\/li>\n<li>Publish - the map automatically follows as readers scroll!<\/li>\n<\/ol>\n\n<h4>Examples<\/h4>\n\n<ul>\n<li><a href=\"https:\/\/randomwire.com\/maling-ancient-road\/\">Maling Ancient Road<\/a><\/li>\n<li><a href=\"https:\/\/randomwire.com\/jiyugaoka-green-roads\/\">Jiyugaoka's Green Roads<\/a><\/li>\n<li><a href=\"https:\/\/randomwire.com\/hakuba\/\">Hakuba: Into The Abyss<\/a><\/li>\n<li><a href=\"https:\/\/randomwire.com\/shimanami-kaido\/\">Cycling the Shimanami Kaido<\/a><\/li>\n<\/ul>\n\n<h4>Compatibility<\/h4>\n\n<ul>\n<li>Browsers: Chrome 105+, Safari 15.4+<\/li>\n<li>Themes: Tested on Twenty Twenty-Four and Twenty Twenty-Five. Should work on most block themes. Classic themes are not supported.<\/li>\n<\/ul>\n\n<h3>Configuring Additional Map Providers (Optional)<\/h3>\n\n<p>Mapthread includes three free map styles out of the box (Street, Satellite, Topographic). You can also connect additional tile providers with an API key for more map styles: <strong>Mapbox<\/strong>, <strong>Thunderforest<\/strong>, <strong>JawgMaps<\/strong>, <strong>Stadia Maps<\/strong>.<\/p>\n\n<ol>\n<li>Go to Settings &gt; Mapthread<\/li>\n<li>Enter your API key for any supported provider (Mapbox, Thunderforest, JawgMaps, Stadia Maps)<\/li>\n<li>Select which map styles to enable for each provider<\/li>\n<li>Save Changes \u2014 enabled styles will appear in the map layer switcher on the frontend<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20is%20a%20gpx%20file%3F\"><h3>What is a GPX file?<\/h3><\/dt>\n<dd><p>GPX (GPS Exchange Format) is a standard file format for GPS data. Most hiking apps, fitness trackers, and GPS devices can export GPX files.<\/p><\/dd>\n<dt id=\"where%20do%20i%20get%20gpx%20files%3F\"><h3>Where do I get GPX files?<\/h3><\/dt>\n<dd><p>You can export GPX files from:\n* Hiking apps (Gaia GPS, AllTrails, etc.)\n* Fitness apps (Strava, Garmin Connect, etc.)\n* GPS devices (Garmin, Suunto, etc.)\n* Google Maps (via Google My Maps)<\/p><\/dd>\n<dt id=\"can%20i%20use%20multiple%20gpx%20files%20in%20one%20post%3F\"><h3>Can I use multiple GPX files in one post?<\/h3><\/dt>\n<dd><p>Not currently. Only the first Map GPX block per post is used.<\/p><\/dd>\n<dt id=\"how%20do%20i%20get%20coordinates%20for%20markers%3F\"><h3>How do I get coordinates for markers?<\/h3><\/dt>\n<dd><ul>\n<li><strong>Import from GPX<\/strong> \u2014 if your GPX file has named waypoints, click \"Import as Map Markers\" in the Map GPX block to create markers automatically<\/li>\n<li>Use the built-in address search (type any place name)<\/li>\n<li>Paste coordinates from Google Maps (right-click a location)<\/li>\n<li>Use coordinates from your GPS device or app<\/li>\n<\/ul><\/dd>\n<dt id=\"can%20i%20import%20waypoints%20from%20my%20gpx%20file%3F\"><h3>Can I import waypoints from my GPX file?<\/h3><\/dt>\n<dd><p>Yes, if your GPX file contains named waypoints (<code>&lt;wpt&gt;<\/code> elements with a <code>&lt;name&gt;<\/code> tag). After uploading your GPX file, the Map GPX block will show an \"Import as Map Markers\" button with a count of available waypoints. Clicking it creates Map Marker blocks for all waypoints not already present in the post, inserted immediately after the Map GPX block. Re-clicking is safe \u2014 already-imported waypoints are detected by coordinates and skipped.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20my%20theme%3F\"><h3>Does it work with my theme?<\/h3><\/dt>\n<dd><p>Mapthread is designed for block themes. It has not been tested with classic themes.<\/p><\/dd>\n<dt id=\"is%20there%20a%20file%20size%20limit%20for%20gpx%3F\"><h3>Is there a file size limit for GPX?<\/h3><\/dt>\n<dd><p>We recommend GPX files under 10MB. Larger files will show a warning and may be slow to render.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20map%2Ftrack%2Fmarker%20colors%3F\"><h3>Can I customize the map\/track\/marker colors?<\/h3><\/dt>\n<dd><p>Not currently. But you can set emojis for each Marker instead of the default.<\/p><\/dd>\n<dt id=\"how%20do%20i%20add%20more%20map%20styles%3F\"><h3>How do I add more map styles?<\/h3><\/dt>\n<dd><p>Go to Settings &gt; Mapthread and enter your API key for any supported provider (Mapbox, Thunderforest, JawgMaps, Stadia Maps). Then select which styles to enable. Each provider offers free tiers suitable for most blogs.<\/p><\/dd>\n<dt id=\"are%20api%20keys%20secure%3F\"><h3>Are API keys secure?<\/h3><\/dt>\n<dd><p>The tile provider API keys used by Mapthread are publishable tokens designed for client-side use. Security is handled via domain restrictions configured in each provider's dashboard.<\/p><\/dd>\n<dt id=\"does%20this%20work%20offline%3F\"><h3>Does this work offline?<\/h3><\/dt>\n<dd><p>No, Mapthread requires an internet connection to load map tiles.<\/p><\/dd>\n<dt id=\"where%20can%20i%20get%20support%3F\"><h3>Where can I get support?<\/h3><\/dt>\n<dd><p>Post in the <a href=\"https:\/\/wordpress.org\/support\/plugin\/mapthread\/\">plugin support forum<\/a> or <a href=\"https:\/\/github.com\/randomwire\/Mapthread\/issues\">open an issue on GitHub<\/a><\/p><\/dd>\n<dt id=\"can%20i%20contribute%20to%20the%20plugin%3F\"><h3>Can I contribute to the plugin?<\/h3><\/dt>\n<dd><p>Yes! Mapthread is open source \u2014 contributions are welcome at <a href=\"https:\/\/github.com\/randomwire\/Mapthread\">github.com\/randomwire\/Mapthread<\/a><\/p><\/dd>\n<dt id=\"what%20third-party%20libraries%20does%20mapthread%20use%3F\"><h3>What third-party libraries does Mapthread use?<\/h3><\/dt>\n<dd><ul>\n<li><a href=\"https:\/\/leafletjs.com\/\">Leaflet.js<\/a> (BSD-2-Clause) \u2014 Interactive map rendering<\/li>\n<li><a href=\"https:\/\/github.com\/brunob\/leaflet.fullscreen\">Leaflet.fullscreen<\/a> (MIT) \u2014 Fullscreen map control<\/li>\n<li><a href=\"https:\/\/www.chartjs.org\/\">Chart.js<\/a> (MIT) \u2014 Elevation profile visualization<\/li>\n<\/ul><\/dd>\n<dt id=\"does%20mapthread%20connect%20to%20any%20external%20services%3F\"><h3>Does Mapthread connect to any external services?<\/h3><\/dt>\n<dd><p>Yes. Mapthread connects to third-party services to display map tiles, geocode addresses, and look up elevation data. Below is a full description of each service, what data is sent, and when.<\/p>\n\n<p><strong>OpenStreetMap Tile Service<\/strong>\nUsed for: Rendering the default \"Street\" map layer.\nWhen: Every time a visitor views a page containing a Mapthread map, the browser requests tile images from OpenStreetMap servers.\nData sent: Tile coordinate requests (zoom level, x\/y tile numbers) indicating the geographic area being viewed. The visitor's IP address is visible to OpenStreetMap servers.\n<a href=\"https:\/\/wiki.osmfoundation.org\/wiki\/Terms_of_Use\">Terms of Use<\/a> | <a href=\"https:\/\/wiki.osmfoundation.org\/wiki\/Privacy_Policy\">Privacy Policy<\/a> | <a href=\"https:\/\/operations.osmfoundation.org\/policies\/tiles\/\">Tile Usage Policy<\/a><\/p>\n\n<p><strong>Esri \/ ArcGIS World Imagery<\/strong>\nUsed for: Rendering the optional \"Satellite\" map layer.\nWhen: Only when the Satellite layer is enabled in Settings &gt; Mapthread and a visitor selects it. No requests are made if the layer is disabled.\nData sent: Tile coordinate requests and the visitor's IP address.\n<a href=\"https:\/\/www.esri.com\/en-us\/legal\/terms\/full-master-agreement\">Terms of Use<\/a> | <a href=\"https:\/\/www.esri.com\/en-us\/privacy\/overview\">Privacy Policy<\/a><\/p>\n\n<p><strong>OpenTopoMap<\/strong>\nUsed for: Rendering the optional \"Topographic\" map layer.\nWhen: Only when the Topographic layer is enabled in Settings &gt; Mapthread and a visitor selects it.\nData sent: Tile coordinate requests and the visitor's IP address.\n<a href=\"https:\/\/opentopomap.org\/about\">Terms of Use \/ Privacy Policy<\/a><\/p>\n\n<p><strong>Nominatim (OpenStreetMap Geocoding)<\/strong>\nUsed for: Address search autocomplete when editing a Map Marker block.\nWhen: Only in the WordPress block editor when an author types into the address search field. Not triggered on the public frontend.\nData sent: The search query text (partial address or place name) and the editor's IP address.\n<a href=\"https:\/\/operations.osmfoundation.org\/policies\/nominatim\/\">Usage Policy<\/a> | <a href=\"https:\/\/wiki.osmfoundation.org\/wiki\/Privacy_Policy\">Privacy Policy<\/a><\/p>\n\n<p><strong>Open-Elevation API<\/strong>\nUsed for: Looking up elevation data for GPX tracks that lack elevation information.\nWhen: Server-side only \u2014 when a GPX file is uploaded that has no elevation data and the elevation profile feature is enabled. The request is made from the WordPress server to <a href=\"https:\/\/api.open-elevation.com\/api\/v1\/lookup\">api.open-elevation.com<\/a>, not from the visitor's browser.\nData sent: GPS coordinates (latitude\/longitude pairs) sampled from the GPX track, sent from the WordPress server's IP address. No user accounts or personal data involved.\n<a href=\"https:\/\/open-elevation.com\/\">Service<\/a> | <a href=\"https:\/\/github.com\/Jorl17\/open-elevation\">Source<\/a> | <a href=\"https:\/\/github.com\/Jorl17\/open-elevation\/blob\/master\/license.md\">License (GPL-2.0)<\/a><\/p>\n\n<p><strong>Optional Tile Providers<\/strong> (each requires an API key configured in Settings &gt; Mapthread)<\/p>\n\n<p>The following services are only contacted when a site administrator has entered an API key and a visitor selects the corresponding map layer. In each case the browser sends tile coordinate requests, the configured API key\/token, and the visitor's IP address.<\/p>\n\n<ul>\n<li><strong>Mapbox<\/strong> | <a href=\"https:\/\/www.mapbox.com\/legal\/tos\">Terms<\/a> | <a href=\"https:\/\/www.mapbox.com\/legal\/privacy\">Privacy<\/a><\/li>\n<li><strong>Thunderforest<\/strong> | <a href=\"https:\/\/www.thunderforest.com\/terms\/\">Terms<\/a> | <a href=\"https:\/\/www.thunderforest.com\/privacy\/\">Privacy<\/a><\/li>\n<li><strong>JawgMaps<\/strong> | <a href=\"https:\/\/www.jawg.io\/en\/terms\/\">Terms<\/a> | <a href=\"https:\/\/www.jawg.io\/en\/privacy\/\">Privacy<\/a><\/li>\n<li><strong>Stadia Maps<\/strong> | <a href=\"https:\/\/stadiamaps.com\/terms-of-service\/\">Terms<\/a> | <a href=\"https:\/\/stadiamaps.com\/privacy\/privacy-policy\/\">Privacy<\/a><\/li>\n<\/ul><\/dd>\n<dt id=\"where%20can%20i%20find%20the%20source%20code%3F\"><h3>Where can I find the source code?<\/h3><\/dt>\n<dd><p>The compiled JavaScript and CSS files in the <code>build\/<\/code> directory are generated from human-readable source files. The full source code is available at <a href=\"https:\/\/github.com\/randomwire\/Mapthread\">github.com\/randomwire\/Mapthread<\/a><\/p>\n\n<p>To build from source:\n1. Clone the repository\n2. Run <code>npm install<\/code>\n3. Run <code>npm run build<\/code><\/p>\n\n<p>This uses <code>@wordpress\/scripts<\/code> (webpack) to compile the source files in <code>assets\/js\/<\/code> and <code>assets\/css\/<\/code> into the production <code>build\/<\/code> directory.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.6.1 - 2026-02-25<\/h4>\n\n<ul>\n<li>Added: Import named waypoints from GPX as Map Marker blocks \u2014 after uploading a GPX file, a button appears in the block editor to instantly create Map Marker blocks from any named <code>&lt;wpt&gt;<\/code> elements in the file. Already-imported waypoints are detected by coordinates and skipped to prevent duplicates.<\/li>\n<\/ul>\n\n<h4>1.6.0 - 2026-02-23<\/h4>\n\n<ul>\n<li>First official release on the WordPress.org plugin directory<\/li>\n<\/ul>\n\n<h4>1.5.8 - 2026-02-22<\/h4>\n\n<ul>\n<li>Added: Source code link added to Description section of readme for immediate visibility to reviewers<\/li>\n<li>Added: Source repository comment prepended to all compiled JavaScript files via webpack<\/li>\n<\/ul>\n\n<h4>1.5.7 - 2026-02-21<\/h4>\n\n<ul>\n<li>Added: Elevation chart crosshair syncs with map track hover \u2014 a dashed indicator and dot appear on the elevation profile when hovering over the GPX track, showing elevation at the cursor position<\/li>\n<\/ul>\n\n<h4>1.5.6 - 2026-02-20<\/h4>\n\n<ul>\n<li>Improved: External services section reformatted to match WordPress.org scanner expectations \u2014 renamed header, added explicit Privacy Policy URLs for every service<\/li>\n<li>Improved: Third-party libraries separated into dedicated readme section<\/li>\n<li>Improved: Source code repository link added to plugin Description for reviewer visibility<\/li>\n<\/ul>\n\n<h4>1.5.5 - 2026-02-20<\/h4>\n\n<ul>\n<li>Fixed: Replaced inline script on settings page with properly enqueued JavaScript via wp_enqueue_script<\/li>\n<li>Added: Source code and build instructions section in readme for compiled assets<\/li>\n<li>Improved: External services documentation \u2014 added explicit service URLs and terms\/privacy links for Esri and Open-Elevation<\/li>\n<\/ul>\n\n<h4>1.5.4 - 2026-02-19<\/h4>\n\n<ul>\n<li>Added: Attribution info button replaces attribution bar to fix mobile overlap with scale indicator<\/li>\n<li>Added: Standardized typography across all map text elements with theme isolation<\/li>\n<li>Fixed: Thunderforest layer attribution parsing leaving stray \"Data\" text in imagery section<\/li>\n<li>Improved: SCSS refactored \u2014 consolidated selectors under #mapthread-map nesting<\/li>\n<\/ul>\n\n<h4>1.5.3 - 2026-02-19<\/h4>\n\n<ul>\n<li>Added: Auto-detect imperial units (miles\/feet) for US-based readers via browser timezone<\/li>\n<li>Improved: Elevation stats bar layout \u2014 removed gain\/loss icons, widened responsive breakpoint for longer imperial values<\/li>\n<li>Fixed: Non-Latin numeral systems (e.g. Devanagari) no longer appear in elevation stats<\/li>\n<li>Updated: Map scale indicator now matches the detected unit system<\/li>\n<\/ul>\n\n<h4>1.5.2 - 2026-02-19<\/h4>\n\n<ul>\n<li>Fixed: Removed external CDN dependency \u2014 emoji picker now uses a self-contained curated grid<\/li>\n<li>Fixed: Block apiVersion updated from 2 to 3 for WordPress 7.0+ compatibility<\/li>\n<li>Improved: External services documentation expanded with data usage details and privacy policy links<\/li>\n<li>Note: REST API permission_callback was already fixed in v1.5.1<\/li>\n<\/ul>\n\n<h4>1.5.1 - 2026-02-17<\/h4>\n\n<ul>\n<li>Fixed: Smooth zoom transitions in follow mode instead of abrupt jumps<\/li>\n<li>Fixed: Missing function in elevation profile causing JS errors<\/li>\n<\/ul>\n\n<h4>1.5.0 - 2026-02-16<\/h4>\n\n<ul>\n<li>Added: Settings page (Settings &gt; Mapthread) for configuring map tile providers<\/li>\n<li>Added: Support for Mapbox, Thunderforest, JawgMaps, and Stadia Maps tile providers<\/li>\n<li>Added: Per-provider API key storage and style selection<\/li>\n<li>Added: Toggleable free layers (Satellite, Topographic) with Street Map always available as fallback<\/li>\n<li>Added: Dynamic layer switcher \u2014 frontend dropdown reflects configured providers<\/li>\n<li>Added: Default Map Style dropdown in block editor now shows all available layers<\/li>\n<li>Improved: Layer panel scrolls when many styles are enabled<\/li>\n<\/ul>\n\n<h4>1.3.9 - 2026-02-12<\/h4>\n\n<ul>\n<li>Added: GPX route support \u2014 files with route points (<code>&lt;rte&gt;<\/code>) are now parsed alongside tracks<\/li>\n<\/ul>\n\n<h4>1.3.8 - 2026-02-12<\/h4>\n\n<ul>\n<li>Improved: Combined latitude and longitude into a single Coordinates field \u2014 paste directly from Google Maps or Gaia GPS<\/li>\n<li>Improved: Mobile \u2014 map starts hidden by default with a \"Show map\" tooltip, prioritising story content on first load<\/li>\n<\/ul>\n\n<h4>1.3.7 - 2026-02-11<\/h4>\n\n<ul>\n<li>Fixed: Elevation gain\/loss overcounting \u2014 added median filter to remove GPS spikes, tuned smoothing parameters to match Gaia GPS accuracy<\/li>\n<li>Improved: Elevation stats text legibility on chart<\/li>\n<\/ul>\n\n<h4>1.3.6 - 2026-02-11<\/h4>\n\n<ul>\n<li>Improved: Map dismiss button on desktop now overlays the page \u2014 article expands to full width when map is hidden<\/li>\n<\/ul>\n\n<h4>1.3.5 - 2026-02-11<\/h4>\n\n<ul>\n<li>Added: Ctrl\/Cmd+scroll to zoom map \u2014 bare scroll over the map no longer hijacks page scrolling; a brief hint overlay guides users to use Ctrl (or \u2318 on macOS) to zoom<\/li>\n<\/ul>\n\n<h4>1.3.4 - 2026-02-10<\/h4>\n\n<ul>\n<li>Added: Map dismiss button \u2014 collapse the map to a small restore tile to read the full-width article, restore with one tap<\/li>\n<\/ul>\n\n<h4>1.3.3 - 2026-02-09<\/h4>\n\n<ul>\n<li>Improved: Continuous animation loop for map following \u2014 camera now glides smoothly to target after scrolling stops instead of freezing mid-animation<\/li>\n<\/ul>\n\n<h4>1.3.2 - 2026-02-09<\/h4>\n\n<ul>\n<li>Fixed: Track drift when another plugin loads a conflicting Leaflet version \u2014 switched to Canvas renderer which is immune to SVG transform corruption<\/li>\n<\/ul>\n\n<h4>1.3.1 - 2026-02-09<\/h4>\n\n<ul>\n<li>Fixed: Track alignment bug when another plugin loads a conflicting Leaflet CSS version<\/li>\n<li>Added: Donate link on WordPress admin Plugins page row<\/li>\n<\/ul>\n\n<h4>1.3.0 - 2026-02-09<\/h4>\n\n<ul>\n<li>Added: Multiple map styles - Switch between Street, Satellite, and Topographic views<\/li>\n<li>Added: Layer control widget for easy map style switching<\/li>\n<li>Added: Fullscreen button for immersive map viewing<\/li>\n<li>Added: Default Map Style setting in block editor to choose initial view<\/li>\n<li>Technical: Leaflet.fullscreen ^5.3.0 integration<\/li>\n<li>Technical: Esri World Imagery and OpenTopoMap tile providers<\/li>\n<\/ul>\n\n<h4>1.2.0 - 2026-02-09<\/h4>\n\n<ul>\n<li>Added: Elevation profile chart powered by Chart.js with Open-Elevation API<\/li>\n<li>Added: Elevation profile toggle in Map GPX block settings<\/li>\n<li>Added: Emoji marker support for map markers<\/li>\n<li>Added: Marker position indicators on elevation chart<\/li>\n<li>Changed: Moved Leaflet attribution to top-right corner<\/li>\n<li>Fixed: Elevation profile toggle now hidden when no GPX file loaded<\/li>\n<li>Technical: Chart.js ^4.5.1 integration for elevation visualization<\/li>\n<\/ul>\n\n<h4>1.1.0 - 2026-02-03<\/h4>\n\n<ul>\n<li>Added: Address search with Nominatim API autocomplete<\/li>\n<li>Added: Markers-only mode (no GPX required)<\/li>\n<li>Added: Mini map preview in address search<\/li>\n<li>Improved: Map bounds calculation from markers<\/li>\n<\/ul>\n\n<h4>1.0.0 - 2026-02-01<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Map GPX block for track upload<\/li>\n<li>Map Marker block for waypoints<\/li>\n<li>Auto-following map behavior<\/li>\n<li>Desktop and mobile responsive layouts<\/li>\n<li>Performance optimizations<\/li>\n<\/ul>","raw_excerpt":"Transform your travel stories into interactive map experiences. Upload GPX files, place markers, watch the map follow as readers scroll.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/283303","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=283303"}],"author":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/randomwire"}],"wp:attachment":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=283303"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=283303"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=283303"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=283303"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=283303"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=283303"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}