{"id":64,"date":"2026-01-06T20:44:43","date_gmt":"2026-01-06T20:44:43","guid":{"rendered":"https:\/\/michaelwinchester.com\/mesh-plug\/?page_id=64"},"modified":"2026-01-06T20:44:44","modified_gmt":"2026-01-06T20:44:44","slug":"developer-reference","status":"publish","type":"page","link":"https:\/\/michaelwinchester.com\/mesh-plug\/developer-reference\/","title":{"rendered":"Developer Reference"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Mesh-Plug for WordPress<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Developer Reference and Integration Guide<\/h2>\n\n\n\n<p><strong>Updated: January 2026 (v0.5.x)<\/strong><\/p>\n\n\n\n<p>Mesh-Plug bridges Meshtastic networks and MQTT data streams into WordPress, allowing developers to <strong>observe, store, enrich, and react<\/strong> to live mesh data using familiar WordPress tools.<\/p>\n\n\n\n<p>This document is a technical appendix for developers who want to extend Mesh-Plug beyond the default UI; custom dashboards, automations, integrations, and data pipelines.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1) Architecture Overview<\/h2>\n\n\n\n<p>Mesh-Plug is structured as layered services rather than a single monolith. Each layer can be extended or intercepted independently.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">MQTT Service Layer<\/h3>\n\n\n\n<p>Responsible for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Broker connection and authentication<\/li>\n\n\n\n<li>Topic subscription management<\/li>\n\n\n\n<li>MQTT-over-WebSocket handling (ws \/ wss)<\/li>\n\n\n\n<li>Payload ingestion and JSON decoding<\/li>\n<\/ul>\n\n\n\n<p>Supported connection modes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Auto mode<\/strong>; broker resolved via site domain and proxy or tunnel<\/li>\n\n\n\n<li><strong>Manual mode<\/strong>; explicit <code>ws:\/\/<\/code> or <code>wss:\/\/<\/code> endpoint with credentials, TLS, and ACLs<\/li>\n<\/ul>\n\n\n\n<p>This layer is intentionally isolated from rendering and storage.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Data Manager<\/h3>\n\n\n\n<p>Normalizes inbound messages and routes them to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Transient cache (always enabled)<\/li>\n\n\n\n<li>Optional database archive table<\/li>\n\n\n\n<li>Automation and event hooks<\/li>\n<\/ul>\n\n\n\n<p>Archive table (optional):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{wp_prefix}meshtastic_archive\n<\/code><\/pre>\n\n\n\n<p>Messages are normalized once and reused across the system.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">NodeDB Cache (Optional)<\/h3>\n\n\n\n<p>Lightweight, in-memory cache of node metadata:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Node ID<\/li>\n\n\n\n<li>Node name<\/li>\n\n\n\n<li>Last seen timestamp<\/li>\n\n\n\n<li>Position (if available)<\/li>\n<\/ul>\n\n\n\n<p>Used to enrich messages at render time. Stored as a WordPress option and rebuilt dynamically.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Shortcode and Rendering Layer<\/h3>\n\n\n\n<p>Responsible for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rendering live or archived data<\/li>\n\n\n\n<li>Tables, logs, charts, maps, and node summaries<\/li>\n\n\n\n<li>Live Refresh and timed refresh modes<\/li>\n\n\n\n<li>Theme-aware output<\/li>\n<\/ul>\n\n\n\n<p>Rendering never talks directly to MQTT.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Automation Layer<\/h3>\n\n\n\n<p>Rule-based engine that evaluates normalized messages and triggers actions such as:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Email notifications<\/li>\n\n\n\n<li>Webhooks<\/li>\n\n\n\n<li>PHP callbacks<\/li>\n<\/ul>\n\n\n\n<p>Rules are evaluated after normalization and before rendering.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">REST API Layer<\/h3>\n\n\n\n<p>Exposes read and write access for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>JavaScript dashboards<\/li>\n\n\n\n<li>External systems<\/li>\n\n\n\n<li>Headless or hybrid front ends<\/li>\n<\/ul>\n\n\n\n<p>All REST responses are derived from the same normalized message pool.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2) MQTT Message Normalization<\/h2>\n\n\n\n<p>All inbound MQTT messages are converted into a common PHP array before use.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;\n  'topic'       =&gt; 'msh\/2\/e\/nodedata',\n  'timestamp'   =&gt; 1730828392,     \/\/ UNIX seconds (UTC)\n  'node_id'     =&gt; '2',\n  'node_name'   =&gt; 'FieldNode02',  \/\/ via NodeDB or payload\n  'text'        =&gt; 'Hello from Node 2',\n  'rssi'        =&gt; -67,\n  'snr'         =&gt; 9.5,\n  'battery'     =&gt; 3.81,\n  'temperature' =&gt; 22.4,\n  'raw'         =&gt; '{ ...original JSON... }'\n]\n<\/code><\/pre>\n\n\n\n<p>Notes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Unknown or custom fields are preserved<\/li>\n\n\n\n<li>Telemetry, position, and vendor-specific fields pass through untouched<\/li>\n\n\n\n<li>Normalization happens exactly once per message<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3) Shortcode Reference<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Universal shortcode<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;mesh_plug_display]\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Attributes<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Attribute<\/th><th>Description<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td><code>topic<\/code><\/td><td>Topic or wildcard<\/td><td><code>msh\/#<\/code><\/td><\/tr><tr><td><code>format<\/code><\/td><td>log, text, table, chart, map, nodes<\/td><td><code>format=\"table\"<\/code><\/td><\/tr><tr><td><code>limit<\/code><\/td><td>Max rows or messages<\/td><td><code>limit=\"20\"<\/code><\/td><\/tr><tr><td><code>order<\/code><\/td><td>asc or desc<\/td><td><code>order=\"desc\"<\/code><\/td><\/tr><tr><td><code>filter_field<\/code><\/td><td>Field name to filter on<\/td><td><code>filter_field=\"text\"<\/code><\/td><\/tr><tr><td><code>filter_value<\/code><\/td><td>Match value<\/td><td><code>filter_value=\"alert\"<\/code><\/td><\/tr><tr><td><code>refresh<\/code><\/td><td>Auto-refresh interval (seconds)<\/td><td><code>refresh=\"10\"<\/code><\/td><\/tr><tr><td><code>chart_type<\/code><\/td><td>line, bar, gauge, scatter<\/td><td><code>chart_type=\"line\"<\/code><\/td><\/tr><tr><td><code>value_field<\/code><\/td><td>Numeric field to chart<\/td><td><code>value_field=\"temperature\"<\/code><\/td><\/tr><tr><td><code>columns<\/code><\/td><td>Table column list<\/td><td><code>timestamp,node_name,rssi<\/code><\/td><\/tr><tr><td><code>empty_text<\/code><\/td><td>Display when no data<\/td><td><code>Waiting for data\u2026<\/code><\/td><\/tr><tr><td><code>nodedb<\/code><\/td><td>Enrich with NodeDB<\/td><td><code>nodedb=\"on\"<\/code><\/td><\/tr><tr><td><code>dedupe<\/code><\/td><td>Collapse duplicates<\/td><td><code>dedupe=\"on\"<\/code><\/td><\/tr><tr><td><code>theme<\/code><\/td><td>light, dark, system<\/td><td><code>theme=\"system\"<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Maps render automatically when latitude and longitude fields are present and map support is enabled.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Shortcode examples<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;mesh_plug_display\n  topic=\"msh\/2\/e\/telemetry\"\n  format=\"chart\"\n  chart_type=\"line\"\n  value_field=\"temperature\"\n  refresh=\"30\"]\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;mesh_plug_display\n  topic=\"msh\/#\"\n  format=\"table\"\n  columns=\"timestamp,node_name,text,rssi\"\n  filter_field=\"text\"\n  filter_value=\"alert\"\n  limit=\"20\"\n  order=\"desc\"\n  nodedb=\"on\"]\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4) PHP Hooks and Filters<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">4.1 <code>mesh_plug_before_render<\/code><\/h3>\n\n\n\n<p>Filter the message array before rendering.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add_filter('mesh_plug_before_render', function (array $messages, array $atts) {\n    return array_filter($messages, fn($m) =&gt; isset($m&#91;'rssi']) &amp;&amp; $m&#91;'rssi'] &gt; -70);\n}, 10, 2);\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4.2 <code>mesh_plug_format_message<\/code><\/h3>\n\n\n\n<p>Modify or enrich individual messages.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add_filter('mesh_plug_format_message', function (array $msg) {\n    if (isset($msg&#91;'rssi'])) {\n        $msg&#91;'signal_quality'] = $msg&#91;'rssi'] &gt; -70 ? 'Good' : 'Weak';\n    }\n    return $msg;\n});\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4.3 <code>mesh_plug_message<\/code><\/h3>\n\n\n\n<p>Triggered when a new MQTT message is received and normalized.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add_action('mesh_plug_message', function (array $msg) {\n    error_log(\"Node {$msg&#91;'node_id']} sent: \" . ($msg&#91;'text'] ?? '&#91;no text]'));\n});\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4.4 <code>mesh_plug_automation_triggered<\/code><\/h3>\n\n\n\n<p>Runs after an automation rule executes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add_action('mesh_plug_automation_triggered', function (array $rule, array $result) {\n    \/\/ Inspect success, HTTP status, or error data\n});\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5) REST API<\/h2>\n\n\n\n<p>Base path:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/wp-json\/mesh-plug\/v1\/\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Endpoints<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Endpoint<\/th><th>Method<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><code>\/messages<\/code><\/td><td>GET<\/td><td>Recent messages<\/td><\/tr><tr><td><code>\/messages\/latest<\/code><\/td><td>GET<\/td><td>Latest per topic<\/td><\/tr><tr><td><code>\/topics<\/code><\/td><td>GET<\/td><td>Active topics with counts<\/td><\/tr><tr><td><code>\/automations<\/code><\/td><td>GET<\/td><td>Automation rules (redacted)<\/td><\/tr><tr><td><code>\/publish<\/code><\/td><td>POST<\/td><td>Publish MQTT message (optional)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Example request:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET \/wp-json\/mesh-plug\/v1\/messages?topic=msh\/2\/e\/telemetry&amp;limit=10\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Authentication<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Nonces required for POST requests<\/li>\n\n\n\n<li>Default capability: <code>manage_options<\/code> (filterable)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6) Automation Rule Schema<\/h2>\n\n\n\n<p>Internally stored as structured arrays.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;\n  'id'   =&gt; 7,\n  'name' =&gt; 'Battery Warning',\n  'topic' =&gt; 'msh\/#',\n  'condition' =&gt; &#91;\n      'field'    =&gt; 'battery',\n      'operator' =&gt; '&lt;',\n      'value'    =&gt; 3.5\n  ],\n  'actions' =&gt; &#91;\n    &#91;\n      'type'    =&gt; 'email',\n      'to'      =&gt; 'admin@domain.com',\n      'subject' =&gt; 'Low Battery {{node_id}}',\n      'body'    =&gt; 'Battery: {{battery}}V'\n    ]\n  ]\n];\n<\/code><\/pre>\n\n\n\n<p>Template tokens such as <code>{{battery}}<\/code> and <code>{{node_name}}<\/code> are rendered at runtime.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7) JavaScript Front-End API<\/h2>\n\n\n\n<p>Mesh-Plug exposes a minimal browser API for dynamic interfaces.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>window.MeshPlug\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Methods<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>subscribe(topic, callback)<\/code><\/li>\n\n\n\n<li><code>unsubscribe(topic)<\/code><\/li>\n\n\n\n<li><code>latest(topic)<\/code><\/li>\n\n\n\n<li><code>publish(topic, payload)<\/code> (if enabled)<\/li>\n<\/ul>\n\n\n\n<p>Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MeshPlug.subscribe('msh\/#', data =&gt; {\n  console.log('New message:', data);\n});\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8) PHP Utility Functions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Fetch messages<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>$messages = mesh_plug_get_messages(&#91;\n  'topic' =&gt; 'msh\/#',\n  'limit' =&gt; 10,\n  'order' =&gt; 'desc'\n]);\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Publish message<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>mesh_plug_publish('msh\/local\/toDevice', &#91;\n  'text' =&gt; 'Hello from WordPress'\n]);\n<\/code><\/pre>\n\n\n\n<p>Publishing requires broker and plugin write permissions.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">9) Database Schema (Archive)<\/h2>\n\n\n\n<p>Table:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{wp_prefix}meshtastic_archive\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Column<\/th><th>Type<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td>id<\/td><td>BIGINT<\/td><td>Primary key<\/td><\/tr><tr><td>topic<\/td><td>VARCHAR(255)<\/td><td>MQTT topic<\/td><\/tr><tr><td>payload<\/td><td>LONGTEXT<\/td><td>Raw JSON<\/td><\/tr><tr><td>timestamp<\/td><td>DATETIME<\/td><td>Message time (UTC)<\/td><\/tr><tr><td>node_id<\/td><td>VARCHAR(64)<\/td><td>Node ID<\/td><\/tr><tr><td>node_name<\/td><td>VARCHAR(191)<\/td><td>Node name<\/td><\/tr><tr><td>rssi<\/td><td>FLOAT<\/td><td>Signal strength<\/td><\/tr><tr><td>battery<\/td><td>FLOAT<\/td><td>Battery voltage<\/td><\/tr><tr><td>hash<\/td><td>CHAR(40)<\/td><td>SHA1 for dedupe<\/td><\/tr><tr><td>created_at<\/td><td>DATETIME<\/td><td>Insert time<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Recommended indexes: <code>topic<\/code>, <code>timestamp<\/code>, <code>node_id<\/code>, <code>hash<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">10) Security and Best Practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Always use credentials on remote brokers<\/li>\n\n\n\n<li>Prefer TLS (<code>wss:\/\/<\/code>) for public endpoints<\/li>\n\n\n\n<li>Scope topics tightly in production<\/li>\n\n\n\n<li>Escape custom output using WordPress helpers<\/li>\n\n\n\n<li>Limit refresh intervals on high-traffic dashboards<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">11) Extending Mesh-Plug<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>class My_Custom_Extension {\n    public function __construct() {\n        add_action('mesh_plug_message', &#91;$this, 'process']);\n    }\n\n    public function process(array $msg) {\n        if (!empty($msg&#91;'temperature']) &amp;&amp; $msg&#91;'temperature'] &gt; 30) {\n            wp_mail('alerts@domain.com', 'High Temperature', print_r($msg, true));\n        }\n    }\n}\n\nnew My_Custom_Extension();\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">12) Debugging and Diagnostics<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Enable <code>WP_DEBUG_LOG<\/code><\/li>\n\n\n\n<li>Optional constant:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>define('MESH_PLUG_DEBUG', true);\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Diagnostics UI: <strong>Mesh-Plug \u2192 Diagnostics<\/strong><\/li>\n<\/ul>\n\n\n\n<p>If WP-CLI support is enabled:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wp mesh-plug status\nwp mesh-plug subscribe msh\/# --limit=5\nwp mesh-plug publish msh\/test '{\"text\":\"Ping\"}'\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">13) Compatibility<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>PHP: 8.1+<\/li>\n\n\n\n<li>WordPress: 6.2+<\/li>\n\n\n\n<li>Charts: Chart.js 4.x<\/li>\n\n\n\n<li>Brokers: Mosquitto, EMQX, HiveMQ (WS\/WSS)<\/li>\n<\/ul>\n\n\n\n<p>Shortcode and REST contracts are stable across the 0.5.x series.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Final Notes<\/h2>\n\n\n\n<p>This reference is intentionally exhaustive. Mesh-Plug is designed to let developers <strong>stay inside WordPress<\/strong> while building real-time, mesh-aware systems.<\/p>\n\n\n\n<p>MQTT handles transport; WordPress handles presentation and logic. Mesh-Plug connects the two cleanly.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mesh-Plug for WordPress Developer Reference and Integration Guide Updated: January 2026 (v0.5.x) Mesh-Plug bridges Meshtastic networks and MQTT data streams into WordPress, allowing developers to observe, store, enrich, and react to live mesh data using familiar WordPress tools. This document is a technical appendix for developers who want to extend Mesh-Plug beyond the default UI; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-64","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/pages\/64","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/comments?post=64"}],"version-history":[{"count":3,"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/pages\/64\/revisions"}],"predecessor-version":[{"id":111,"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/pages\/64\/revisions\/111"}],"wp:attachment":[{"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/media?parent=64"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}