Crowdsourced speed radar and heatmap for Ethiopia — SolidJS, Leaflet, Supabase
# dehna-net — Crowdsourced Speed Radar and Heatmap
A high-performance, real-time internet speed benchmark and crowd-telemetry mapping platform built with SolidJS, Leaflet, Vite, and Supabase.
Inspired by boundr's dark aesthetic and map-first interface.
---
## Features
- **Automatic Location and Telemetry Detection**: Browser Geolocation API with reverse-geocoding and IP fallback.
- **Multi-Phase Speed Benchmark**:
- **Latency and Jitter**: Rapid multi-packet round-trip probe against edge nodes.
- **Download Throughput**: Real-time streaming chunk download with live 60 FPS gauge and sparkline waveform.
- **Upload Throughput**: Payload buffer benchmark.
- **Interactive Leaflet Radar Map**:
- CartoDB Dark Matter vector tiles.
- Speed-graded pulsating radar markers (Gigabit, High Speed, Standard, Slow).
- Telemetry inspection popovers with Ping, Jitter, ISP, and Time-ago badges.
- Dynamic camera fly-to on test completion.
- **Network and Carrier Controls**:
- Network selector options (5G, 4G LTE, Wi-Fi, Fiber, Starlink, Cable).
- ISP and carrier lookup with editable overrides.
- Top filter bar to isolate specific network technologies.
- **Viewport Area Telemetry Summary**: Live calculations of average download, upload, ping, and top provider in current map bounds.
- **Anti-Abuse and Deduplication**:
- 3-minute device cooldown throttling.
- Geohash Level 7 spatial aggregation.
- **Supabase Realtime Sync and Offline Resilience**: Operates in local-first mode with pre-seeded points when unconfigured, and connects to Supabase Realtime when credentials are provided in environment variables.
---
## Tech Stack
- **Framework**: SolidJS + Vite + TypeScript (Strict Mode)
- **Mapping**: Leaflet.js
- **Linter and Formatter**: Biome
- **Backend and Database**: Supabase (PostgreSQL, Realtime, RLS)
- **Package Manager**: Bun
---
## Getting Started
### 1. Install Dependencies
```bash
bun install
```
### 2. (Optional) Configure Supabase
Copy `.env.example` to `.env` and add …