Repository files navigation

MeshCore GOME WarDriver

VersionLicensePlatform

A browser-based Progressive Web App for wardriving with MeshCore devices. Connect via Bluetooth, send GPS pings, and build coverage maps for the Ottawa (YOW) mesh network.

Live at: wardrive.ottawamesh.ca

⚠️ Deprecation Notice

This project is deprecated and no longer supported. Development and support have moved to the new MeshMapper Mobile App and the modern web app listed below. Please use the official mobile apps or the new web app for continued updates and support.

If you'd like to participate in beta testing or get live updates, join the MeshMapper Discord server.

Discord: https://discord.gg/x8aBDZwyz7


🚀 Quick Start

Before you start

  • Take a backup of your companion (this webapp is beyond experimental).

Android

  1. Disconnect the MeshCore app and close it
  2. Open Google Chrome
  3. Go to https://wardrive.ottawamesh.ca/
  4. Connect your device
  5. Pick interval and power
  6. Send a ping or start auto ping
  7. Move around and watch it track

iOS

  1. Disconnect the MeshCore app and close it
  2. Install Bluefy (Web BLE browser): https://apps.apple.com/us/app/bluefy-web-ble-browser/id1492822055
  3. Open https://wardrive.ottawamesh.ca/ in Bluefy
  4. Connect your device
  5. Pick interval and power
  6. Send a ping or start auto ping
  7. Move around and watch it track

⚠️Note (iOS): You must use Bluefy. Other iOS browsers (including Safari) do not support Web Bluetooth (BLE).


✨ Features

🗺️ Live Coverage Map

  • Embedded MeshMapper integration
  • API POST to MeshMapper to enable failed ping blocks
  • Auto-refresh after each ping (30-second delay)
  • Interactive view of coverage zones and repeaters

📍 GPS Tracking

  • High-accuracy positioning for precise coverage mapping
  • Real-time location updates with continuous GPS watch
  • Accuracy display shows GPS precision in meters
  • Location age indicator keeps you informed

🤖 Ping Modes

  • Manual Mode: Send pings on demand
  • Auto Mode: Continuous pinging at 15s, 30s, or 60s intervals
  • Wake Lock: Keeps screen on during auto mode for GPS accuracy

📡 Power Configuration

Configure radio power for accurate coverage data:

  • N/A (default)
  • 0.3w, 0.6w, 1.0w

📊 Session Tracking

  • Scrollable ping history log
  • Timestamps and coordinates for every ping
  • Track your wardriving session in real-time

📱 Platform Support

PlatformBrowserStatus
AndroidChrome / Chromium✅ Fully Tested
iOSBluefy✅ Fully Tested
iOSSafari❌ Not Supported

Android Requirements

  • Chrome or Chromium-based browser
  • Bluetooth and Location permissions enabled
  • High-accuracy location mode recommended

iOS Requirements

  • Bluefy browser (free)
  • Bluetooth and Location permissions enabled
  • Keep app in foreground with screen on

🗺️ Ottawa (YOW) Region

This application is configured for the Ottawa Mesh network:

Pings are sent to the wardriving MeshCore channel to build community coverage maps.


🔧 Technical Stack

  • Web Bluetooth API - BLE device communication
  • Geolocation API - High-accuracy GPS tracking
  • Screen Wake Lock API - Power management
  • Tailwind CSS - Responsive UI design
  • PWA Ready - Progressive Web App manifest
  • MeshMapper API Integration - Automatic ping data posting for mesh network comparison

🔐 MeshMapper API Integration

This app automatically posts ping data to the YOW MeshMapper API to help compare if messages were received on the mesh.


Debug Logging

A lightweight debugging system designed for development without impacting production performance.

Features

  • Toggle Control — Enable via URL parameter (?debug=true) or set the default directly in code
  • Consistent Logging API — Use debugLog(), debugWarn(), and debugError() for uniform output
  • Production-Safe — Disabled by default to keep the console clean in production environments

📋 Requirements

MeshCore Device

  • MeshCore device
  • Wardriving channel configured on your device

Browser

  • Android: Chrome or Chromium-based browser
  • iOS: Bluefy browser (Safari not supported)

Permissions

  • ✅ Bluetooth access
  • ✅ High-accuracy location services
  • ✅ Keep app in foreground during use

🛠️ Development

Building Tailwind CSS

This project uses Tailwind CSS v4 to generate the styles. If you make changes to the HTML or need to rebuild the CSS:

# Install dependencies
npm install
# Build CSS once
npm run build:css
# Watch for changes and rebuild automatically
npm run watch:css

The CSS is generated from content/tailwind-in.css and outputs to content/tailwind.css.


🙏 Credits

This project is a fork and adaptation:

  • Original Project: kallanreed/mesh-map by Kyle Reed
  • Modified By: MrAlders0n for Ottawa Mesh
  • MeshMapper Backend: Created by @CSP-Tom - The backend database and mapping software that receives pings and maps coverage live for the community at MeshMapper.net
  • Community: Ottawa Mesh and all beta testers

🤝 Contributing

Found a bug? Have a feature request?


📄 License

This project is licensed under the MIT License - see the LICENSE file for details.


🚗📡 Happy Wardriving!

Help build the Ottawa Mesh coverage maps and grow the MeshCore network!

Visit wardrive.ottawamesh.ca today and contribute to the community coverage database!

About

Code for my MeshCore Wardrive Web App.

Resources

Stars

22 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

MeshCore GOME WarDriver

VersionLicensePlatform

A browser-based Progressive Web App for wardriving with MeshCore devices. Connect via Bluetooth, send GPS pings, and build coverage maps for the Ottawa (YOW) mesh network.

Live at: wardrive.ottawamesh.ca

⚠️ Deprecation Notice

This project is deprecated and no longer supported. Development and support have moved to the new MeshMapper Mobile App and the modern web app listed below. Please use the official mobile apps or the new web app for continued updates and support.

If you'd like to participate in beta testing or get live updates, join the MeshMapper Discord server.

Discord: https://discord.gg/x8aBDZwyz7


🚀 Quick Start

Before you start

  • Take a backup of your companion (this webapp is beyond experimental).

Android

  1. Disconnect the MeshCore app and close it
  2. Open Google Chrome
  3. Go to https://wardrive.ottawamesh.ca/
  4. Connect your device
  5. Pick interval and power
  6. Send a ping or start auto ping
  7. Move around and watch it track

iOS

  1. Disconnect the MeshCore app and close it
  2. Install Bluefy (Web BLE browser): https://apps.apple.com/us/app/bluefy-web-ble-browser/id1492822055
  3. Open https://wardrive.ottawamesh.ca/ in Bluefy
  4. Connect your device
  5. Pick interval and power
  6. Send a ping or start auto ping
  7. Move around and watch it track

⚠️Note (iOS): You must use Bluefy. Other iOS browsers (including Safari) do not support Web Bluetooth (BLE).


✨ Features

🗺️ Live Coverage Map

  • Embedded MeshMapper integration
  • API POST to MeshMapper to enable failed ping blocks
  • Auto-refresh after each ping (30-second delay)
  • Interactive view of coverage zones and repeaters

📍 GPS Tracking

  • High-accuracy positioning for precise coverage mapping
  • Real-time location updates with continuous GPS watch
  • Accuracy display shows GPS precision in meters
  • Location age indicator keeps you informed

🤖 Ping Modes

  • Manual Mode: Send pings on demand
  • Auto Mode: Continuous pinging at 15s, 30s, or 60s intervals
  • Wake Lock: Keeps screen on during auto mode for GPS accuracy

📡 Power Configuration

Configure radio power for accurate coverage data:

  • N/A (default)
  • 0.3w, 0.6w, 1.0w

📊 Session Tracking

  • Scrollable ping history log
  • Timestamps and coordinates for every ping
  • Track your wardriving session in real-time

📱 Platform Support

PlatformBrowserStatus
AndroidChrome / Chromium✅ Fully Tested
iOSBluefy✅ Fully Tested
iOSSafari❌ Not Supported

Android Requirements

  • Chrome or Chromium-based browser
  • Bluetooth and Location permissions enabled
  • High-accuracy location mode recommended

iOS Requirements

  • Bluefy browser (free)
  • Bluetooth and Location permissions enabled
  • Keep app in foreground with screen on

🗺️ Ottawa (YOW) Region

This application is configured for the Ottawa Mesh network:

Pings are sent to the wardriving MeshCore channel to build community coverage maps.


🔧 Technical Stack

  • Web Bluetooth API - BLE device communication
  • Geolocation API - High-accuracy GPS tracking
  • Screen Wake Lock API - Power management
  • Tailwind CSS - Responsive UI design
  • PWA Ready - Progressive Web App manifest
  • MeshMapper API Integration - Automatic ping data posting for mesh network comparison

🔐 MeshMapper API Integration

This app automatically posts ping data to the YOW MeshMapper API to help compare if messages were received on the mesh.


Debug Logging

A lightweight debugging system designed for development without impacting production performance.

Features

  • Toggle Control — Enable via URL parameter (?debug=true) or set the default directly in code
  • Consistent Logging API — Use debugLog(), debugWarn(), and debugError() for uniform output
  • Production-Safe — Disabled by default to keep the console clean in production environments

📋 Requirements

MeshCore Device

  • MeshCore device
  • Wardriving channel configured on your device

Browser

  • Android: Chrome or Chromium-based browser
  • iOS: Bluefy browser (Safari not supported)

Permissions

  • ✅ Bluetooth access
  • ✅ High-accuracy location services
  • ✅ Keep app in foreground during use

🛠️ Development

Building Tailwind CSS

This project uses Tailwind CSS v4 to generate the styles. If you make changes to the HTML or need to rebuild the CSS:

# Install dependencies
npm install
# Build CSS once
npm run build:css
# Watch for changes and rebuild automatically
npm run watch:css

The CSS is generated from content/tailwind-in.css and outputs to content/tailwind.css.


🙏 Credits

This project is a fork and adaptation:

  • Original Project: kallanreed/mesh-map by Kyle Reed
  • Modified By: MrAlders0n for Ottawa Mesh
  • MeshMapper Backend: Created by @CSP-Tom - The backend database and mapping software that receives pings and maps coverage live for the community at MeshMapper.net
  • Community: Ottawa Mesh and all beta testers

🤝 Contributing

Found a bug? Have a feature request?


📄 License

This project is licensed under the MIT License - see the LICENSE file for details.


🚗📡 Happy Wardriving!

Help build the Ottawa Mesh coverage maps and grow the MeshCore network!

Visit wardrive.ottawamesh.ca today and contribute to the community coverage database!

About

Code for my MeshCore Wardrive Web App.

Resources

Stars

22 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MeshCore GOME WarDriver

VersionLicensePlatform

A browser-based Progressive Web App for wardriving with MeshCore devices. Connect via Bluetooth, send GPS pings, and build coverage maps for the Ottawa (YOW) mesh network.

Live at: wardrive.ottawamesh.ca

⚠️ Deprecation Notice

This project is deprecated and no longer supported. Development and support have moved to the new MeshMapper Mobile App and the modern web app listed below. Please use the official mobile apps or the new web app for continued updates and support.

If you'd like to participate in beta testing or get live updates, join the MeshMapper Discord server.

Discord: https://discord.gg/x8aBDZwyz7


🚀 Quick Start

Before you start

  • Take a backup of your companion (this webapp is beyond experimental).

Android

  1. Disconnect the MeshCore app and close it
  2. Open Google Chrome
  3. Go to https://wardrive.ottawamesh.ca/
  4. Connect your device
  5. Pick interval and power
  6. Send a ping or start auto ping
  7. Move around and watch it track

iOS

  1. Disconnect the MeshCore app and close it
  2. Install Bluefy (Web BLE browser): https://apps.apple.com/us/app/bluefy-web-ble-browser/id1492822055
  3. Open https://wardrive.ottawamesh.ca/ in Bluefy
  4. Connect your device
  5. Pick interval and power
  6. Send a ping or start auto ping
  7. Move around and watch it track

⚠️Note (iOS): You must use Bluefy. Other iOS browsers (including Safari) do not support Web Bluetooth (BLE).


✨ Features

🗺️ Live Coverage Map

  • Embedded MeshMapper integration
  • API POST to MeshMapper to enable failed ping blocks
  • Auto-refresh after each ping (30-second delay)
  • Interactive view of coverage zones and repeaters

📍 GPS Tracking

  • High-accuracy positioning for precise coverage mapping
  • Real-time location updates with continuous GPS watch
  • Accuracy display shows GPS precision in meters
  • Location age indicator keeps you informed

🤖 Ping Modes

  • Manual Mode: Send pings on demand
  • Auto Mode: Continuous pinging at 15s, 30s, or 60s intervals
  • Wake Lock: Keeps screen on during auto mode for GPS accuracy

📡 Power Configuration

Configure radio power for accurate coverage data:

  • N/A (default)
  • 0.3w, 0.6w, 1.0w

📊 Session Tracking

  • Scrollable ping history log
  • Timestamps and coordinates for every ping
  • Track your wardriving session in real-time

📱 Platform Support

PlatformBrowserStatus
AndroidChrome / Chromium✅ Fully Tested
iOSBluefy✅ Fully Tested
iOSSafari❌ Not Supported

Android Requirements

  • Chrome or Chromium-based browser
  • Bluetooth and Location permissions enabled
  • High-accuracy location mode recommended

iOS Requirements

  • Bluefy browser (free)
  • Bluetooth and Location permissions enabled
  • Keep app in foreground with screen on

🗺️ Ottawa (YOW) Region

This application is configured for the Ottawa Mesh network:

Pings are sent to the wardriving MeshCore channel to build community coverage maps.


🔧 Technical Stack

  • Web Bluetooth API - BLE device communication
  • Geolocation API - High-accuracy GPS tracking
  • Screen Wake Lock API - Power management
  • Tailwind CSS - Responsive UI design
  • PWA Ready - Progressive Web App manifest
  • MeshMapper API Integration - Automatic ping data posting for mesh network comparison

🔐 MeshMapper API Integration

This app automatically posts ping data to the YOW MeshMapper API to help compare if messages were received on the mesh.


Debug Logging

A lightweight debugging system designed for development without impacting production performance.

Features

  • Toggle Control — Enable via URL parameter (?debug=true) or set the default directly in code
  • Consistent Logging API — Use debugLog(), debugWarn(), and debugError() for uniform output
  • Production-Safe — Disabled by default to keep the console clean in production environments

📋 Requirements

MeshCore Device

  • MeshCore device
  • Wardriving channel configured on your device

Browser

  • Android: Chrome or Chromium-based browser
  • iOS: Bluefy browser (Safari not supported)

Permissions

  • ✅ Bluetooth access
  • ✅ High-accuracy location services
  • ✅ Keep app in foreground during use

🛠️ Development

Building Tailwind CSS

This project uses Tailwind CSS v4 to generate the styles. If you make changes to the HTML or need to rebuild the CSS:

# Install dependencies
npm install
# Build CSS once
npm run build:css
# Watch for changes and rebuild automatically
npm run watch:css

The CSS is generated from content/tailwind-in.css and outputs to content/tailwind.css.


🙏 Credits

This project is a fork and adaptation:

  • Original Project: kallanreed/mesh-map by Kyle Reed
  • Modified By: MrAlders0n for Ottawa Mesh
  • MeshMapper Backend: Created by @CSP-Tom - The backend database and mapping software that receives pings and maps coverage live for the community at MeshMapper.net
  • Community: Ottawa Mesh and all beta testers

🤝 Contributing

Found a bug? Have a feature request?


📄 License

This project is licensed under the MIT License - see the LICENSE file for details.


🚗📡 Happy Wardriving!

Help build the Ottawa Mesh coverage maps and grow the MeshCore network!

Visit wardrive.ottawamesh.ca today and contribute to the community coverage database!

About

Code for my MeshCore Wardrive Web App.

Resources

Stars

22 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MeshCore GOME WarDriver

VersionLicensePlatform

A browser-based Progressive Web App for wardriving with MeshCore devices. Connect via Bluetooth, send GPS pings, and build coverage maps for the Ottawa (YOW) mesh network.

Live at: wardrive.ottawamesh.ca

⚠️ Deprecation Notice

This project is deprecated and no longer supported. Development and support have moved to the new MeshMapper Mobile App and the modern web app listed below. Please use the official mobile apps or the new web app for continued updates and support.

If you'd like to participate in beta testing or get live updates, join the MeshMapper Discord server.

Discord: https://discord.gg/x8aBDZwyz7


🚀 Quick Start

Before you start

  • Take a backup of your companion (this webapp is beyond experimental).

Android

  1. Disconnect the MeshCore app and close it
  2. Open Google Chrome
  3. Go to https://wardrive.ottawamesh.ca/
  4. Connect your device
  5. Pick interval and power
  6. Send a ping or start auto ping
  7. Move around and watch it track

iOS

  1. Disconnect the MeshCore app and close it
  2. Install Bluefy (Web BLE browser): https://apps.apple.com/us/app/bluefy-web-ble-browser/id1492822055
  3. Open https://wardrive.ottawamesh.ca/ in Bluefy
  4. Connect your device
  5. Pick interval and power
  6. Send a ping or start auto ping
  7. Move around and watch it track

⚠️Note (iOS): You must use Bluefy. Other iOS browsers (including Safari) do not support Web Bluetooth (BLE).


✨ Features

🗺️ Live Coverage Map

  • Embedded MeshMapper integration
  • API POST to MeshMapper to enable failed ping blocks
  • Auto-refresh after each ping (30-second delay)
  • Interactive view of coverage zones and repeaters

📍 GPS Tracking

  • High-accuracy positioning for precise coverage mapping
  • Real-time location updates with continuous GPS watch
  • Accuracy display shows GPS precision in meters
  • Location age indicator keeps you informed

🤖 Ping Modes

  • Manual Mode: Send pings on demand
  • Auto Mode: Continuous pinging at 15s, 30s, or 60s intervals
  • Wake Lock: Keeps screen on during auto mode for GPS accuracy

📡 Power Configuration

Configure radio power for accurate coverage data:

  • N/A (default)
  • 0.3w, 0.6w, 1.0w

📊 Session Tracking

  • Scrollable ping history log
  • Timestamps and coordinates for every ping
  • Track your wardriving session in real-time

📱 Platform Support

PlatformBrowserStatus
AndroidChrome / Chromium✅ Fully Tested
iOSBluefy✅ Fully Tested
iOSSafari❌ Not Supported

Android Requirements

  • Chrome or Chromium-based browser
  • Bluetooth and Location permissions enabled
  • High-accuracy location mode recommended

iOS Requirements

  • Bluefy browser (free)
  • Bluetooth and Location permissions enabled
  • Keep app in foreground with screen on

🗺️ Ottawa (YOW) Region

This application is configured for the Ottawa Mesh network:

Pings are sent to the wardriving MeshCore channel to build community coverage maps.


🔧 Technical Stack

  • Web Bluetooth API - BLE device communication
  • Geolocation API - High-accuracy GPS tracking
  • Screen Wake Lock API - Power management
  • Tailwind CSS - Responsive UI design
  • PWA Ready - Progressive Web App manifest
  • MeshMapper API Integration - Automatic ping data posting for mesh network comparison

🔐 MeshMapper API Integration

This app automatically posts ping data to the YOW MeshMapper API to help compare if messages were received on the mesh.


Debug Logging

A lightweight debugging system designed for development without impacting production performance.

Features

  • Toggle Control — Enable via URL parameter (?debug=true) or set the default directly in code
  • Consistent Logging API — Use debugLog(), debugWarn(), and debugError() for uniform output
  • Production-Safe — Disabled by default to keep the console clean in production environments

📋 Requirements

MeshCore Device

  • MeshCore device
  • Wardriving channel configured on your device

Browser

  • Android: Chrome or Chromium-based browser
  • iOS: Bluefy browser (Safari not supported)

Permissions

  • ✅ Bluetooth access
  • ✅ High-accuracy location services
  • ✅ Keep app in foreground during use

🛠️ Development

Building Tailwind CSS

This project uses Tailwind CSS v4 to generate the styles. If you make changes to the HTML or need to rebuild the CSS:

# Install dependencies
npm install
# Build CSS once
npm run build:css
# Watch for changes and rebuild automatically
npm run watch:css

The CSS is generated from content/tailwind-in.css and outputs to content/tailwind.css.


🙏 Credits

This project is a fork and adaptation:

  • Original Project: kallanreed/mesh-map by Kyle Reed
  • Modified By: MrAlders0n for Ottawa Mesh
  • MeshMapper Backend: Created by @CSP-Tom - The backend database and mapping software that receives pings and maps coverage live for the community at MeshMapper.net
  • Community: Ottawa Mesh and all beta testers

🤝 Contributing

Found a bug? Have a feature request?


📄 License

This project is licensed under the MIT License - see the LICENSE file for details.


🚗📡 Happy Wardriving!

Help build the Ottawa Mesh coverage maps and grow the MeshCore network!

Visit wardrive.ottawamesh.ca today and contribute to the community coverage database!

About

Code for my MeshCore Wardrive Web App.

Resources

Stars

22 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

MeshCore GOME WarDriver

VersionLicensePlatform

A browser-based Progressive Web App for wardriving with MeshCore devices. Connect via Bluetooth, send GPS pings, and build coverage maps for the Ottawa (YOW) mesh network.

Live at: wardrive.ottawamesh.ca

⚠️ Deprecation Notice

This project is deprecated and no longer supported. Development and support have moved to the new MeshMapper Mobile App and the modern web app listed below. Please use the official mobile apps or the new web app for continued updates and support.

If you'd like to participate in beta testing or get live updates, join the MeshMapper Discord server.

Discord: https://discord.gg/x8aBDZwyz7


🚀 Quick Start

Before you start

  • Take a backup of your companion (this webapp is beyond experimental).

Android

  1. Disconnect the MeshCore app and close it
  2. Open Google Chrome
  3. Go to https://wardrive.ottawamesh.ca/
  4. Connect your device
  5. Pick interval and power
  6. Send a ping or start auto ping
  7. Move around and watch it track

iOS

  1. Disconnect the MeshCore app and close it
  2. Install Bluefy (Web BLE browser): https://apps.apple.com/us/app/bluefy-web-ble-browser/id1492822055
  3. Open https://wardrive.ottawamesh.ca/ in Bluefy
  4. Connect your device
  5. Pick interval and power
  6. Send a ping or start auto ping
  7. Move around and watch it track

⚠️Note (iOS): You must use Bluefy. Other iOS browsers (including Safari) do not support Web Bluetooth (BLE).


✨ Features

🗺️ Live Coverage Map

  • Embedded MeshMapper integration
  • API POST to MeshMapper to enable failed ping blocks
  • Auto-refresh after each ping (30-second delay)
  • Interactive view of coverage zones and repeaters

📍 GPS Tracking

  • High-accuracy positioning for precise coverage mapping
  • Real-time location updates with continuous GPS watch
  • Accuracy display shows GPS precision in meters
  • Location age indicator keeps you informed

🤖 Ping Modes

  • Manual Mode: Send pings on demand
  • Auto Mode: Continuous pinging at 15s, 30s, or 60s intervals
  • Wake Lock: Keeps screen on during auto mode for GPS accuracy

📡 Power Configuration

Configure radio power for accurate coverage data:

  • N/A (default)
  • 0.3w, 0.6w, 1.0w

📊 Session Tracking

  • Scrollable ping history log
  • Timestamps and coordinates for every ping
  • Track your wardriving session in real-time

📱 Platform Support

PlatformBrowserStatus
AndroidChrome / Chromium✅ Fully Tested
iOSBluefy✅ Fully Tested
iOSSafari❌ Not Supported

Android Requirements

  • Chrome or Chromium-based browser
  • Bluetooth and Location permissions enabled
  • High-accuracy location mode recommended

iOS Requirements

  • Bluefy browser (free)
  • Bluetooth and Location permissions enabled
  • Keep app in foreground with screen on

🗺️ Ottawa (YOW) Region

This application is configured for the Ottawa Mesh network:

Pings are sent to the wardriving MeshCore channel to build community coverage maps.


🔧 Technical Stack

  • Web Bluetooth API - BLE device communication
  • Geolocation API - High-accuracy GPS tracking
  • Screen Wake Lock API - Power management
  • Tailwind CSS - Responsive UI design
  • PWA Ready - Progressive Web App manifest
  • MeshMapper API Integration - Automatic ping data posting for mesh network comparison

🔐 MeshMapper API Integration

This app automatically posts ping data to the YOW MeshMapper API to help compare if messages were received on the mesh.


Debug Logging

A lightweight debugging system designed for development without impacting production performance.

Features

  • Toggle Control — Enable via URL parameter (?debug=true) or set the default directly in code
  • Consistent Logging API — Use debugLog(), debugWarn(), and debugError() for uniform output
  • Production-Safe — Disabled by default to keep the console clean in production environments

📋 Requirements

MeshCore Device

  • MeshCore device
  • Wardriving channel configured on your device

Browser

  • Android: Chrome or Chromium-based browser
  • iOS: Bluefy browser (Safari not supported)

Permissions

  • ✅ Bluetooth access
  • ✅ High-accuracy location services
  • ✅ Keep app in foreground during use

🛠️ Development

Building Tailwind CSS

This project uses Tailwind CSS v4 to generate the styles. If you make changes to the HTML or need to rebuild the CSS:

# Install dependencies
npm install
# Build CSS once
npm run build:css
# Watch for changes and rebuild automatically
npm run watch:css

The CSS is generated from content/tailwind-in.css and outputs to content/tailwind.css.


🙏 Credits

This project is a fork and adaptation:

  • Original Project: kallanreed/mesh-map by Kyle Reed
  • Modified By: MrAlders0n for Ottawa Mesh
  • MeshMapper Backend: Created by @CSP-Tom - The backend database and mapping software that receives pings and maps coverage live for the community at MeshMapper.net
  • Community: Ottawa Mesh and all beta testers

🤝 Contributing

Found a bug? Have a feature request?


📄 License

This project is licensed under the MIT License - see the LICENSE file for details.


🚗📡 Happy Wardriving!

Help build the Ottawa Mesh coverage maps and grow the MeshCore network!

Visit wardrive.ottawamesh.ca today and contribute to the community coverage database!

About

Code for my MeshCore Wardrive Web App.

Resources

Stars

22 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MeshCore GOME WarDriver

VersionLicensePlatform

A browser-based Progressive Web App for wardriving with MeshCore devices. Connect via Bluetooth, send GPS pings, and build coverage maps for the Ottawa (YOW) mesh network.

Live at: wardrive.ottawamesh.ca

⚠️ Deprecation Notice

This project is deprecated and no longer supported. Development and support have moved to the new MeshMapper Mobile App and the modern web app listed below. Please use the official mobile apps or the new web app for continued updates and support.

If you'd like to participate in beta testing or get live updates, join the MeshMapper Discord server.

Discord: https://discord.gg/x8aBDZwyz7


🚀 Quick Start

Before you start

  • Take a backup of your companion (this webapp is beyond experimental).

Android

  1. Disconnect the MeshCore app and close it
  2. Open Google Chrome
  3. Go to https://wardrive.ottawamesh.ca/
  4. Connect your device
  5. Pick interval and power
  6. Send a ping or start auto ping
  7. Move around and watch it track

iOS

  1. Disconnect the MeshCore app and close it
  2. Install Bluefy (Web BLE browser): https://apps.apple.com/us/app/bluefy-web-ble-browser/id1492822055
  3. Open https://wardrive.ottawamesh.ca/ in Bluefy
  4. Connect your device
  5. Pick interval and power
  6. Send a ping or start auto ping
  7. Move around and watch it track

⚠️Note (iOS): You must use Bluefy. Other iOS browsers (including Safari) do not support Web Bluetooth (BLE).


✨ Features

🗺️ Live Coverage Map

  • Embedded MeshMapper integration
  • API POST to MeshMapper to enable failed ping blocks
  • Auto-refresh after each ping (30-second delay)
  • Interactive view of coverage zones and repeaters

📍 GPS Tracking

  • High-accuracy positioning for precise coverage mapping
  • Real-time location updates with continuous GPS watch
  • Accuracy display shows GPS precision in meters
  • Location age indicator keeps you informed

🤖 Ping Modes

  • Manual Mode: Send pings on demand
  • Auto Mode: Continuous pinging at 15s, 30s, or 60s intervals
  • Wake Lock: Keeps screen on during auto mode for GPS accuracy

📡 Power Configuration

Configure radio power for accurate coverage data:

  • N/A (default)
  • 0.3w, 0.6w, 1.0w

📊 Session Tracking

  • Scrollable ping history log
  • Timestamps and coordinates for every ping
  • Track your wardriving session in real-time

📱 Platform Support

PlatformBrowserStatus
AndroidChrome / Chromium✅ Fully Tested
iOSBluefy✅ Fully Tested
iOSSafari❌ Not Supported

Android Requirements

  • Chrome or Chromium-based browser
  • Bluetooth and Location permissions enabled
  • High-accuracy location mode recommended

iOS Requirements

  • Bluefy browser (free)
  • Bluetooth and Location permissions enabled
  • Keep app in foreground with screen on

🗺️ Ottawa (YOW) Region

This application is configured for the Ottawa Mesh network:

Pings are sent to the wardriving MeshCore channel to build community coverage maps.


🔧 Technical Stack

  • Web Bluetooth API - BLE device communication
  • Geolocation API - High-accuracy GPS tracking
  • Screen Wake Lock API - Power management
  • Tailwind CSS - Responsive UI design
  • PWA Ready - Progressive Web App manifest
  • MeshMapper API Integration - Automatic ping data posting for mesh network comparison

🔐 MeshMapper API Integration

This app automatically posts ping data to the YOW MeshMapper API to help compare if messages were received on the mesh.


Debug Logging

A lightweight debugging system designed for development without impacting production performance.

Features

  • Toggle Control — Enable via URL parameter (?debug=true) or set the default directly in code
  • Consistent Logging API — Use debugLog(), debugWarn(), and debugError() for uniform output
  • Production-Safe — Disabled by default to keep the console clean in production environments

📋 Requirements

MeshCore Device

  • MeshCore device
  • Wardriving channel configured on your device

Browser

  • Android: Chrome or Chromium-based browser
  • iOS: Bluefy browser (Safari not supported)

Permissions

  • ✅ Bluetooth access
  • ✅ High-accuracy location services
  • ✅ Keep app in foreground during use

🛠️ Development

Building Tailwind CSS

This project uses Tailwind CSS v4 to generate the styles. If you make changes to the HTML or need to rebuild the CSS:

# Install dependencies
npm install
# Build CSS once
npm run build:css
# Watch for changes and rebuild automatically
npm run watch:css

The CSS is generated from content/tailwind-in.css and outputs to content/tailwind.css.


🙏 Credits

This project is a fork and adaptation:

  • Original Project: kallanreed/mesh-map by Kyle Reed
  • Modified By: MrAlders0n for Ottawa Mesh
  • MeshMapper Backend: Created by @CSP-Tom - The backend database and mapping software that receives pings and maps coverage live for the community at MeshMapper.net
  • Community: Ottawa Mesh and all beta testers

🤝 Contributing

Found a bug? Have a feature request?


📄 License

This project is licensed under the MIT License - see the LICENSE file for details.


🚗📡 Happy Wardriving!

Help build the Ottawa Mesh coverage maps and grow the MeshCore network!

Visit wardrive.ottawamesh.ca today and contribute to the community coverage database!

About

Code for my MeshCore Wardrive Web App.

Resources

Stars

22 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MeshCore GOME WarDriver

VersionLicensePlatform

A browser-based Progressive Web App for wardriving with MeshCore devices. Connect via Bluetooth, send GPS pings, and build coverage maps for the Ottawa (YOW) mesh network.

Live at: wardrive.ottawamesh.ca

⚠️ Deprecation Notice

This project is deprecated and no longer supported. Development and support have moved to the new MeshMapper Mobile App and the modern web app listed below. Please use the official mobile apps or the new web app for continued updates and support.

If you'd like to participate in beta testing or get live updates, join the MeshMapper Discord server.

Discord: https://discord.gg/x8aBDZwyz7


🚀 Quick Start

Before you start

  • Take a backup of your companion (this webapp is beyond experimental).

Android

  1. Disconnect the MeshCore app and close it
  2. Open Google Chrome
  3. Go to https://wardrive.ottawamesh.ca/
  4. Connect your device
  5. Pick interval and power
  6. Send a ping or start auto ping
  7. Move around and watch it track

iOS

  1. Disconnect the MeshCore app and close it
  2. Install Bluefy (Web BLE browser): https://apps.apple.com/us/app/bluefy-web-ble-browser/id1492822055
  3. Open https://wardrive.ottawamesh.ca/ in Bluefy
  4. Connect your device
  5. Pick interval and power
  6. Send a ping or start auto ping
  7. Move around and watch it track

⚠️Note (iOS): You must use Bluefy. Other iOS browsers (including Safari) do not support Web Bluetooth (BLE).


✨ Features

🗺️ Live Coverage Map

  • Embedded MeshMapper integration
  • API POST to MeshMapper to enable failed ping blocks
  • Auto-refresh after each ping (30-second delay)
  • Interactive view of coverage zones and repeaters

📍 GPS Tracking

  • High-accuracy positioning for precise coverage mapping
  • Real-time location updates with continuous GPS watch
  • Accuracy display shows GPS precision in meters
  • Location age indicator keeps you informed

🤖 Ping Modes

  • Manual Mode: Send pings on demand
  • Auto Mode: Continuous pinging at 15s, 30s, or 60s intervals
  • Wake Lock: Keeps screen on during auto mode for GPS accuracy

📡 Power Configuration

Configure radio power for accurate coverage data:

  • N/A (default)
  • 0.3w, 0.6w, 1.0w

📊 Session Tracking

  • Scrollable ping history log
  • Timestamps and coordinates for every ping
  • Track your wardriving session in real-time

📱 Platform Support

PlatformBrowserStatus
AndroidChrome / Chromium✅ Fully Tested
iOSBluefy✅ Fully Tested
iOSSafari❌ Not Supported

Android Requirements

  • Chrome or Chromium-based browser
  • Bluetooth and Location permissions enabled
  • High-accuracy location mode recommended

iOS Requirements

  • Bluefy browser (free)
  • Bluetooth and Location permissions enabled
  • Keep app in foreground with screen on

🗺️ Ottawa (YOW) Region

This application is configured for the Ottawa Mesh network:

Pings are sent to the wardriving MeshCore channel to build community coverage maps.


🔧 Technical Stack

  • Web Bluetooth API - BLE device communication
  • Geolocation API - High-accuracy GPS tracking
  • Screen Wake Lock API - Power management
  • Tailwind CSS - Responsive UI design
  • PWA Ready - Progressive Web App manifest
  • MeshMapper API Integration - Automatic ping data posting for mesh network comparison

🔐 MeshMapper API Integration

This app automatically posts ping data to the YOW MeshMapper API to help compare if messages were received on the mesh.


Debug Logging

A lightweight debugging system designed for development without impacting production performance.

Features

  • Toggle Control — Enable via URL parameter (?debug=true) or set the default directly in code
  • Consistent Logging API — Use debugLog(), debugWarn(), and debugError() for uniform output
  • Production-Safe — Disabled by default to keep the console clean in production environments

📋 Requirements

MeshCore Device

  • MeshCore device
  • Wardriving channel configured on your device

Browser

  • Android: Chrome or Chromium-based browser
  • iOS: Bluefy browser (Safari not supported)

Permissions

  • ✅ Bluetooth access
  • ✅ High-accuracy location services
  • ✅ Keep app in foreground during use

🛠️ Development

Building Tailwind CSS

This project uses Tailwind CSS v4 to generate the styles. If you make changes to the HTML or need to rebuild the CSS:

# Install dependencies
npm install
# Build CSS once
npm run build:css
# Watch for changes and rebuild automatically
npm run watch:css

The CSS is generated from content/tailwind-in.css and outputs to content/tailwind.css.


🙏 Credits

This project is a fork and adaptation:

  • Original Project: kallanreed/mesh-map by Kyle Reed
  • Modified By: MrAlders0n for Ottawa Mesh
  • MeshMapper Backend: Created by @CSP-Tom - The backend database and mapping software that receives pings and maps coverage live for the community at MeshMapper.net
  • Community: Ottawa Mesh and all beta testers

🤝 Contributing

Found a bug? Have a feature request?


📄 License

This project is licensed under the MIT License - see the LICENSE file for details.


🚗📡 Happy Wardriving!

Help build the Ottawa Mesh coverage maps and grow the MeshCore network!

Visit wardrive.ottawamesh.ca today and contribute to the community coverage database!

About

Code for my MeshCore Wardrive Web App.

Resources

Stars

22 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

MeshCore GOME WarDriver

VersionLicensePlatform

A browser-based Progressive Web App for wardriving with MeshCore devices. Connect via Bluetooth, send GPS pings, and build coverage maps for the Ottawa (YOW) mesh network.

Live at: wardrive.ottawamesh.ca

⚠️ Deprecation Notice

This project is deprecated and no longer supported. Development and support have moved to the new MeshMapper Mobile App and the modern web app listed below. Please use the official mobile apps or the new web app for continued updates and support.

If you'd like to participate in beta testing or get live updates, join the MeshMapper Discord server.

Discord: https://discord.gg/x8aBDZwyz7


🚀 Quick Start

Before you start

  • Take a backup of your companion (this webapp is beyond experimental).

Android

  1. Disconnect the MeshCore app and close it
  2. Open Google Chrome
  3. Go to https://wardrive.ottawamesh.ca/
  4. Connect your device
  5. Pick interval and power
  6. Send a ping or start auto ping
  7. Move around and watch it track

iOS

  1. Disconnect the MeshCore app and close it
  2. Install Bluefy (Web BLE browser): https://apps.apple.com/us/app/bluefy-web-ble-browser/id1492822055
  3. Open https://wardrive.ottawamesh.ca/ in Bluefy
  4. Connect your device
  5. Pick interval and power
  6. Send a ping or start auto ping
  7. Move around and watch it track

⚠️Note (iOS): You must use Bluefy. Other iOS browsers (including Safari) do not support Web Bluetooth (BLE).


✨ Features

🗺️ Live Coverage Map

  • Embedded MeshMapper integration
  • API POST to MeshMapper to enable failed ping blocks
  • Auto-refresh after each ping (30-second delay)
  • Interactive view of coverage zones and repeaters

📍 GPS Tracking

  • High-accuracy positioning for precise coverage mapping
  • Real-time location updates with continuous GPS watch
  • Accuracy display shows GPS precision in meters
  • Location age indicator keeps you informed

🤖 Ping Modes

  • Manual Mode: Send pings on demand
  • Auto Mode: Continuous pinging at 15s, 30s, or 60s intervals
  • Wake Lock: Keeps screen on during auto mode for GPS accuracy

📡 Power Configuration

Configure radio power for accurate coverage data:

  • N/A (default)
  • 0.3w, 0.6w, 1.0w

📊 Session Tracking

  • Scrollable ping history log
  • Timestamps and coordinates for every ping
  • Track your wardriving session in real-time

📱 Platform Support

PlatformBrowserStatus
AndroidChrome / Chromium✅ Fully Tested
iOSBluefy✅ Fully Tested
iOSSafari❌ Not Supported

Android Requirements

  • Chrome or Chromium-based browser
  • Bluetooth and Location permissions enabled
  • High-accuracy location mode recommended

iOS Requirements

  • Bluefy browser (free)
  • Bluetooth and Location permissions enabled
  • Keep app in foreground with screen on

🗺️ Ottawa (YOW) Region

This application is configured for the Ottawa Mesh network:

Pings are sent to the wardriving MeshCore channel to build community coverage maps.


🔧 Technical Stack

  • Web Bluetooth API - BLE device communication
  • Geolocation API - High-accuracy GPS tracking
  • Screen Wake Lock API - Power management
  • Tailwind CSS - Responsive UI design
  • PWA Ready - Progressive Web App manifest
  • MeshMapper API Integration - Automatic ping data posting for mesh network comparison

🔐 MeshMapper API Integration

This app automatically posts ping data to the YOW MeshMapper API to help compare if messages were received on the mesh.


Debug Logging

A lightweight debugging system designed for development without impacting production performance.

Features

  • Toggle Control — Enable via URL parameter (?debug=true) or set the default directly in code
  • Consistent Logging API — Use debugLog(), debugWarn(), and debugError() for uniform output
  • Production-Safe — Disabled by default to keep the console clean in production environments

📋 Requirements

MeshCore Device

  • MeshCore device
  • Wardriving channel configured on your device

Browser

  • Android: Chrome or Chromium-based browser
  • iOS: Bluefy browser (Safari not supported)

Permissions

  • ✅ Bluetooth access
  • ✅ High-accuracy location services
  • ✅ Keep app in foreground during use

🛠️ Development

Building Tailwind CSS

This project uses Tailwind CSS v4 to generate the styles. If you make changes to the HTML or need to rebuild the CSS:

# Install dependencies
npm install
# Build CSS once
npm run build:css
# Watch for changes and rebuild automatically
npm run watch:css

The CSS is generated from content/tailwind-in.css and outputs to content/tailwind.css.


🙏 Credits

This project is a fork and adaptation:

  • Original Project: kallanreed/mesh-map by Kyle Reed
  • Modified By: MrAlders0n for Ottawa Mesh
  • MeshMapper Backend: Created by @CSP-Tom - The backend database and mapping software that receives pings and maps coverage live for the community at MeshMapper.net
  • Community: Ottawa Mesh and all beta testers

🤝 Contributing

Found a bug? Have a feature request?


📄 License

This project is licensed under the MIT License - see the LICENSE file for details.


🚗📡 Happy Wardriving!

Help build the Ottawa Mesh coverage maps and grow the MeshCore network!

Visit wardrive.ottawamesh.ca today and contribute to the community coverage database!

About

Code for my MeshCore Wardrive Web App.

Resources

Stars

22 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages