Public dataset of Meshcore network scans collected via mesh-utility-tracker.
mesh-data/
├── scans/
│ ├── 2024-01-15/
│ │ ├── batch-1705334400000.csv ⭐ Browse/search in GitHub
│ │ ├── batch-1705334400000.json
│ │ ├── batch-1705338000000.csv
│ │ └── batch-1705338000000.json
│ └── 2024-01-16/
│ ├── batch-1705420800000.csv
│ └── batch-1705420800000.json
├── deletions/
│ └── 2024-01-15/
│ └── !abcd1234.json
├── index.csv ⭐ Daily statistics
└── README.md
Click any .csv file in GitHub to browse with built-in table viewer. Perfect for:
- ✅ Searching by radio ID
- ✅ Filtering by signal strength
- ✅ Sorting by any column
- ✅ Quick visual inspection
- ✅ Download filtered results
Columns: `radioId, timestamp, datetime_utc, latitude, longitude, altitude, nodeId, rssi, snr, hopLimit`
Example CSV row:
!abcd1234,1705334400000,2024-01-15T10:00:00.000Z,37.774900,-122.419400,50.0,!def45678,-85,8.5,0Zero-hop scans: If hopLimit is empty or 0, it's a direct (zero-hop) connection.
Each batch file contains an array of scan records:
[
{
"radioId": "!abcd1234",
"timestamp": 1705334400000,
"location": {
"lat": 37.7749,
"lon": -122.4194,
"altitude": 50
},
"nodes": [
{
"nodeId": "!def45678",
"rssi": -85,
"snr": 8.5,
"hopLimit": 0
},
{
"nodeId": "!ghi91011",
"rssi": -92,
"snr": 5.2,
"hopLimit": 0
}
]
}
]- radioId: Unique identifier for the scanning device (Meshtastic node ID)
- timestamp: Unix timestamp in milliseconds (UTC)
- location: GPS coordinates of the scan
lat: Latitude in decimal degreeslon: Longitude in decimal degreesaltitude: Altitude in meters (optional)
- nodes: Array of detected mesh nodes
nodeId: Unique identifier of detected noderssi: Received Signal Strength Indicator (dBm)snr: Signal-to-Noise Ratio (dB)
Users can request deletion of their data by:
- Opening mesh-utility-tracker Settings
- Clicking "Delete My Data"
- Confirming the radio ID
- Creating a GitHub issue
Deletion records are stored in deletions/YYYY-MM-DD/:
{
"radioId": "!abcd1234",
"deletedAt": "2024-01-15T10:30:00.000Z",
"action": "deletion"
}- Radio IDs are anonymized (only public node identifiers visible)
- No personal information is collected
- GPS coordinates are user-provided and can be obfuscated in the client
- All data is public and contributed voluntarily
- Navigate to
scans/YYYY-MM-DD/folder - Click any
batch-*.csvfile - GitHub renders it as a searchable table
- Use filter box to search columns
- Click "Raw" → Save to download filtered data
Find scans from specific radio:
!abcd1234 path:scans/ l (CSV)
```python
import pandas as pd
import glob
# Load all CSV files
csv_files = glob.glob('scans/**/*.csv', recursive=True)
dfs = [pd.read_csv(f) for f in csv_files]
all_scans = pd.concat(dfs, ignore_index=True)
print(f"Total scans: {len(all_scans)}")
print(f"Unique radios: {all_scans['radioId'].nunique()}")
# Filter by radio ID
my_scans = all_scans[all_scans['radioId'] == '!abcd1234']
# Filter by signal strength
strong_signals = all_scans[all_scans['rssi'] > -80]
# Export filtered data
my_scans.to_csv('my-filtered-scans.csv', index=False)
# Find all scans from a radio
grep "!abcd1234" scans/**/*.csv
# Find strong signals (rssi > -70)
awk -F',' '$8 > -70' scans/**/*.csv
# Count scans per day
wc -l scans/*/*.csv
# Combine all CSVs for a date range
cat scans/2024-01-{15,16,17}/*.csv > january-week3.csv
### Download Specific Day (CSV)
```bash
curl -O https://raw.githubusercontent.com/just-stuff-tm/mesh-data/main/scans/2024-01-15/batch-1705334400000.csvgit clone https://github.com/just-stuff-tm/mesh-data.git
cd mesh-dataimport json
import glob
scan_files = glob.glob('scans/**/*.json', recursive=True)
all_scans = []
for file in scan_files:
with open(file) as f:
all_scans.extend(json.load(f))
print(f"Total scans: {len(all_scans)}")
print(f"Unique radios: {len(set(s['radioId'] for s in all_scans))}")import fs from 'fs';
import path from 'path';
const scanDir = 'scans';
const allScans = [];
function readScans(dir) {
const files = fs.readdirSync(dir, { withFileTypes: true });
for (const file of files) {
const fullPath = path.join(dir, file.name);
if (file.isDirectory()) {
readScans(fullPath);
} else if (file.name.endsWith('.json')) {
const data = JSON.parse(fs.readFileSync(fullPath, 'utf-8'));
allScans.push(...data);
}
}
}
readScans(scanDir);
console.log(`Total scans: ${allScans.length}`);- Scans are validated before storage
- Duplicate detection based on radioId + timestamp
- Invalid GPS coordinates are rejected
- RSSI/SNR values must be within reasonable ranges
- New batches committed every 20 scans or 5 minutes
- Batch size may vary based on network activity
- Historical data is never modified (append-only)
This dataset is released under CC0 1.0 Universal (Public Domain Dedication).
You are free to:
- Copy, modify, and distribute the data
- Use the data for any purpose, including commercial
- No attribution required (but appreciated!)
Data is automatically collected from mesh-utility-tracker users who opt-in to sharing.
To contribute scans:
- Install mesh-utility-tracker
- Connect your Meshcore companion device
- Enable "Share scan data" in Settings
- Scans are automatically uploaded to this repository
- Report issues: mesh-utility-tracker/issues
- Request data deletion: connect your radio that you want deleted and Click "Delete My Data"
Updated automatically via GitHub Actions
- Total Scans: TBD
- Unique Radios: TBD
- Date Range: TBD
- Last Updated: TBD