{"id":317561,"date":"2026-05-31T09:58:14","date_gmt":"2026-05-31T09:58:14","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/boat-position\/"},"modified":"2026-05-31T09:58:30","modified_gmt":"2026-05-31T09:58:30","slug":"boat-position","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/boat-position\/","author":20981457,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"trunk","tested":"7.0","requires":"6.2","requires_php":"8.1","requires_plugins":null,"header_name":"Boat Position","header_author":"PCIO","header_description":"Tracks and displays the boat's GPS position. Receives positions from the boat's router, stores them in the database, and provides a live map and voyage logbook.","assets_banners_color":"000000","last_updated":"2026-05-31 09:58:30","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/www.paypal.com\/donate\/?hosted_button_id=DFM2JV8JKTTM6","header_plugin_uri":"https:\/\/www.pcio.dk\/","header_author_uri":"https:\/\/www.pcio.dk","rating":0,"author_block_rating":0,"active_installs":0,"downloads":30,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0":{"tag":"1.0","author":"pcio","date":"2026-05-31 10:09:37"}},"upgrade_notice":{"":"<p>Currently there is no updates available. Will be announced on pcio.dk when new evolution of the application is ready.<\/p>","Does this cost anything?":"<p>The plugin is free. If you like my work, you are welcome to support the further development:<\/p>\n\n<p><a href=\"https:\/\/www.paypal.com\/donate\/?hosted_button_id=DFM2JV8JKTTM6\">Donate link<\/a><\/p>","How do I uninstall?":"<p>Deactivate and delete the plugin from the WordPress admin. To also remove the data, open your database admin tool and drop these tables (replace <code>wp_<\/code> with your actual table prefix):<\/p>\n\n<ul>\n<li><code>wp_boat_harbours<\/code><\/li>\n<li><code>wp_boat_legs<\/code><\/li>\n<li><code>wp_boat_positions<\/code><\/li>\n<li><code>wp_boat_trips<\/code><\/li>\n<\/ul>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3555344,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3555344,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3555344,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3555344,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3555247,"resolution":"1","location":"assets","locale":"","width":1447,"height":879},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3555247,"resolution":"2","location":"assets","locale":"","width":1880,"height":931}},"screenshots":{"1":"Live map \u2014 current boat position with directional arrow on OpenSeaMap.","2":"Logbook \u2014 calendar sidebar, trip list, and route drawn on the map."}},"plugin_section":[],"plugin_tags":[13445,3373,16810,2909,550],"plugin_category":[36,49],"plugin_contributors":[265152],"plugin_business_model":[],"class_list":["post-317561","plugin","type-plugin","status-publish","hentry","plugin_tags-boat","plugin_tags-gps","plugin_tags-logbook","plugin_tags-map","plugin_tags-tracking","plugin_category-analytics","plugin_category-maps-and-location","plugin_contributors-pcio","plugin_committers-pcio"],"banners":{"banner":"https:\/\/ps.w.org\/boat-position\/assets\/banner-772x250.png?rev=3555344","banner_2x":"https:\/\/ps.w.org\/boat-position\/assets\/banner-1544x500.png?rev=3555344","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/boat-position\/assets\/icon-128x128.png?rev=3555344","icon_2x":"https:\/\/ps.w.org\/boat-position\/assets\/icon-256x256.png?rev=3555344","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/boat-position\/assets\/screenshot-1.jpg?rev=3555247","caption":"Live map \u2014 current boat position with directional arrow on OpenSeaMap."},{"src":"https:\/\/ps.w.org\/boat-position\/assets\/screenshot-2.jpg?rev=3555247","caption":"Logbook \u2014 calendar sidebar, trip list, and route drawn on the map."}],"raw_content":"<!--section=description-->\n<p>Boat Position turns your WordPress site into a live tracking and logbook service for your boat.<\/p>\n\n<p>The plugin is designed around the Teltonika RUTX50 router (*), a compact Linux-based 5G router with built-in GPS. \nA shell script on the router sends a position to your site every minute. The plugin stores each position, runs a state machine to group positions into trips and legs, and serves two public pages:<\/p>\n\n<ul>\n<li><strong>Live map<\/strong> (<code>\/boat-position\/map<\/code>) \u2014 shows the current position on an OpenStreetMap\/OpenSeaMap map with a rotating arrow icon when underway and an idle indicator when stopped.<\/li>\n<li><strong>Logbook<\/strong> (<code>\/boat-position\/history<\/code>) \u2014 calendar sidebar with trip history. Click any day to see the full route on the map. Logged-in editors can label harbour names and merge incorrectly split trips.<\/li>\n<\/ul>\n\n<p>Over 150 Danish harbours are included as seed data so harbour names are detected automatically from GPS coordinates.<\/p>\n\n<p>No third-party services or API keys are required beyond your own WordPress site. Maps are rendered using the free Leaflet.js library with OpenStreetMap and OpenSeaMap tiles.<\/p>\n\n<p>(*) There are other alternatives to using the RTUTX50 router, any device that has access to a GPS and the internet can be configured as the source of position data.\n    E.g. a linux machine like Rasberry PI connected to either its own GPS or the boat NMEA data.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>boat-position<\/code> directory to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin in <strong>Plugins<\/strong> in the WordPress admin.<\/li>\n<li>Go to <strong>Settings \u2192 Boat Position<\/strong> to set a secret API key and find the router configuration instructions.<\/li>\n<li>Follow the router setup guide in <strong>Plugins \u2192 Boat Position \u2192 About<\/strong> to configure your router's <code>sendgps.sh<\/code> script and cron job.<\/li>\n<li>Send a test position from a command prompt to verify the endpoint is working before installing on the boat.<\/li>\n<\/ol>\n\n<p>After activation, if <code>\/boat-position\/map<\/code> returns a 404, go to <strong>Settings \u2192 Permalinks<\/strong> and click <strong>Save Changes<\/strong> to flush the rewrite rules.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20i%20use%20this%20plugin%3F\"><h3>How do I use this plugin?<\/h3><\/dt>\n<dd><p>Install and activate the plugin, then go to <strong>Settings \u2192 Boat Position<\/strong>. Set a secret API key, then follow the router configuration guide in the About page to set up your router's cron job.<\/p><\/dd>\n<dt id=\"does%20it%20only%20work%20with%20the%20rutx50%20router%3F\"><h3>Does it only work with the RUTX50 router?<\/h3><\/dt>\n<dd><p>No. Any device that can send an HTTP POST request with <code>lat<\/code>, <code>lon<\/code>, <code>speed<\/code>, <code>course<\/code>, and <code>gps_time<\/code> fields to the REST endpoint will work. The About page documents the exact format.<\/p><\/dd>\n<dt id=\"where%20are%20the%20public%20pages%3F\"><h3>Where are the public pages?<\/h3><\/dt>\n<dd><p>The plugin registers two pages automatically \u2014 no WordPress pages or shortcodes are needed:<\/p>\n\n<ul>\n<li>Live map: <code>https:\/\/yoursite.com\/boat-position\/map<\/code><\/li>\n<li>Logbook: <code>https:\/\/yoursite.com\/boat-position\/history<\/code><\/li>\n<\/ul><\/dd>\n<dt id=\"can%20i%20avoid%20storing%20the%20secret%20key%20in%20the%20database%3F\"><h3>Can I avoid storing the secret key in the database?<\/h3><\/dt>\n<dd><p>Yes. Define the key as a constant in <code>wp-config.php<\/code>:<\/p>\n\n<p>define( 'PCIO_BOAT_POSITION_API_KEY', 'your-secret-key-here' );<\/p>\n\n<p>When this constant is present, the database option is ignored and the settings field is shown as read-only.<\/p><\/dd>\n<dt id=\"the%20logbook%20is%20empty%20%E2%80%94%20no%20trips%20appear.\"><h3>The logbook is empty \u2014 no trips appear.<\/h3><\/dt>\n<dd><p>Check that the router is sending data by looking at your database's <code>wp_boat_positions<\/code> table. If rows are present but no trips appear, the trip engine may not have processed them yet \u2014 visit the ingest endpoint directly or check the About page for the manual trigger curl command.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Automatic sailing logbook \u2014 track your boat&#039;s live position and full route history using your onboard GPS router.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/317561","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=317561"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/pcio"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=317561"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=317561"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=317561"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=317561"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=317561"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=317561"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}