
Moskill
telagod/moskill
MosKill - Smart Mosquito Swatter with BLE, Kill Counting & Statistics | ESP32-C3 + KiCad PCB + UniApp

Distributed Earthquake Early Warning (EEW) system built on low-cost ESP32-C3 IoT sensors with Zero-Trust security, multi-node epicenter triangulation, and on-premise AI emergency reports. Includes custom PCB, FastAPI/Redis/TimescaleDB backend, and a React Native mobile app.
QuakeGuard PCB is an open-source printed circuit board by GiZano, from the GiZano/QuakeGuard repository on GitHub, published under the AGPL-3.0 licence. It is a 2-layer board of 61.3 × 89.6 mm with 17 parts on 21 nets, routed with 111 tracks and 32 vias.
It is built around the ESP32-C3-LYRA, NEO-6M and ADXL345-EP. Its parts include 4 connectors, 3 capacitors, 3 resistors and 3 diodes. It belongs with the home automation and IoT and sensors and measurement boards and the ESP32 and RISC-V boards of this library.
Full-Stack IoT Architecture for Real-Time Earthquake Detection
📚 Technical Specification: A comprehensive architecture whitepaper is available in the
docs/directory, compiled via Typst. For a browsable, topic-by-topic reference, check out the project Wiki.

QuakeGuard is a full-stack IoT architecture for real-time detection, analysis, and reporting of seismic events. The system transforms everyday household appliances — washing machines, TVs, refrigerators — into a distributed seismic sensor network, each node capable of detecting and reporting earthquake activity autonomously.
Intelligent edge sensors (ESP32-C3 + ADXL345) analyze vibrations locally using professional-grade algorithms and transmit cryptographically signed data to an asynchronous cloud backend. The backend is engineesred to handle the massive traffic spikes — the Thundering Herd effect — typical during widespread seismic events, ensuring reliable alarm delivery without bottlenecking. A React Native mobile app receives real-time haptic and visual alerts via WebSocket.
The QuakeGuard v2.0 fully assembled PCB, featuring the ESP32-C3 SuperMini, the ADXL345 accelerometer, and the u-blox GNSS module. For a complete list of required components, refer to the Bill of Materials (BOM) in the Wiki.
ESP32-C3 + ADXL345
│
│ MQTT (signed payload)
▼
MQTT Bridge ──► POST /readings/ ──► ECDSA Verification
│
▼
Redis Queue
│
▼
Background Worker ────►┌───────────┐
│ │ (Queue) │ AI Worker │
▼ ▼ │ (Ollama) │
PostgreSQL Redis Pub/Sub ◄─└─────┬─────┘
+ PostGIS │
▼
WebSocket Broadcast
│
▼
React Native Mobile App
(Haptic + Visual Alert)The project follows Microservices and Event-Driven Design principles across three fully independent layers.
firmware/)| Feature | Detail |
|---|---|
| Hardware | ESP32-C3 SuperMini + ADXL345 Accelerometer |
| Sampling Rate | 100 Hz |
| Detection Algorithm | STA/LTA (Short Term / Long Term Average) |
| Signal Processing | Digital High-Pass Filter (HPF) to remove gravity |
| Data Structure | Statically allocated Ring Buffers (RingBuffer<100> STA, RingBuffer<1000> LTA) |
| Security | ECDSA NIST256p cryptographic signing on every payload |
| Transmission | MQTT publish to quakeguard/telemetry |
| Provisioning | Automated device handshake on first boot via POST /devices/register |
| Secret Injection | Compile-time ENROLLMENT_TOKEN via PlatformIO pre-script + #error fail-fast |
backend/)| Feature | Detail |
|---|---|
| Framework | FastAPI (Python 3.11), fully async |
| Security | API Key auth, ECDSA signature verification, Anti-Replay (300s window) |
| Message Broker | Redis — decouples ingestion from processing |
| Rate Limiting | Fixed-window 50 req/s per IP via Redis |
| Alert Engine | ML-like magnitude proxy (M = log10(PGA_calib) + b), threshold M ≥ 4.5 |
| Deduplication | Redis TTL cooldown lock per zone (60s), prevents alert storms |
| Persistence | PostgreSQL + PostGIS with recorded_at timestamps |
| Zone Assignment | Automatic via PostGIS ST_Contains spatial query, ordered by ST_Area ascending |
| Zone Seeding | 8 pre-populated global macro-regions + "Unknown Region" fallback |
| Observability | GET /health — concurrent PostgreSQL + Redis ping |
| Secrets | Fail-fast RuntimeError on missing env vars at startup |
| MQTT Bridge | mqtt_subscriber.py — forwards MQTT payloads to the secure HTTP pipeline |
| Edge AI | Asynchronous emergency report generation via local Ollama (Llama 3.2) |
mobile/)| Feature | Detail |
|---|---|
| Framework | React Native (Expo) with TypeScript |
| Navigation | Expo Router — 4-tab Bottom Navigator (Monitor, Sensors Map, My Devices, Settings) |
| State Management | Zustand slices (usePreferencesStore, useAlertStore) |
| Server State | TanStack Query + Axios — caching, background refetch, retry |
| Real-Time | WebSocket context with exponential backoff reconnection |
| Alert Delivery | SOS haptic vibration pattern + OS push notification via expo-notifications |
| Alert History | In-session feed of last 10 critical events |
| AI Report Banner | Inline AI-generated emergency report (summary + recommendations) for the latest alert, with "Report unavailable" badge on failures |
| Offline Mode | Toggle silences WebSocket, halts all TanStack Query polling |
| Notifications | notificationsEnabled toggle gates haptics and push notifications |
| Safe Areas | react-native-safe-area-context — Dynamic Island and punch-hole compatible |
| OTA Updates | Custom GitHub-based updater hook (useUpdateChecker) polls latest release and triggers native APK sideload prompt |
Data integrity is paramount in an emergency system. Every telemetry packet is cryptographically secured end-to-end.
ESP32 signs payload with ECDSA NIST256p (SHA256)
↓
Backend verifies signature against registered public key
↓
Timestamp validated within 300-second window (Anti-Replay)
↓
API Key checked on every request (X-API-Key header)
↓
Payload accepted → Redis QueueThreat model coverage:
cd backend
cp .env.example .envEdit .env and set the required secrets:
# --- Application Secrets ---
IOT_API_KEY=your_secret_key
MOBILE_WS_TOKEN=your_ws_token
ENROLLMENT_TOKEN=your_enrollment_token
# --- Database ---
POSTGRES_DB=quakeguard_db
POSTGRES_USER=developer
POSTGRES_PASSWORD=your_db_password
API_PORT=8000
# --- Local MQTT (Mosquitto) ---
MQTT_BROKER=localhost
MQTT_PORT=1883
# --- AI Emergency Reports (hybrid Edge AI architecture) ---
AI_REPORT_ENABLED=true
OLLAMA_HOST=http://127.0.0.1:11434
OLLAMA_MODEL=llama3.2:1b⚠️ The backend will refuse to start if any of these are missing — this is intentional fail-fast behavior.
💡 Edge AI Architecture (v2.0.0): To maximize hardware efficiency and avoid Docker's GPU passthrough overhead, QuakeGuard employs an industrial Hybrid Edge AI pattern (similar to NVIDIA Jetson or Tesla FSD architectures). The core AI inference engine (Ollama) runs bare-metal on the host Linux OS, while the application microservices run in Docker and communicate via
network_mode: "host".To enable on-premise AI reports:
- Install Ollama natively on your Linux host:
curl -fsSL https://ollama.com/install.sh | sh- Pull the model natively:
ollama pull llama3.2:1b- Start the Docker stack with the AI worker profile:
docker compose --profile ai up --build -dReports are generated entirely on your machine: telemetry never leaves the host.
cd backend
docker compose up --build -d| Endpoint | URL |
|---|---|
| API | http://localhost:8000 |
| Swagger UI | http://localhost:8000/docs |
| Health Check | http://localhost:8000/health |
| Grafana | http://localhost:3000 |
cd firmware
cp esp32_config.env.example esp32_config.env
# Edit esp32_config.env with your network IP and ENROLLMENT_TOKENFlash via PlatformIO. On first boot the device will:
QuakeGuard-Setup) — serves the mobile APK download link and displays the ECDSA Public Key for enrollmentsensor_id💡 If the sensor registers with
latitude=0.0, longitude=0.0it will be assigned to "Unknown Region". Hardcode your coordinates inmain.cppfor correct zone assignment until GPS integration is complete.
cd mobile
npm installUpdate constants/config.ts with your machine's local IP:
export const API_BASE_URL = "http://YOUR_LOCAL_IP:8000";Create .env in the mobile root:
EXPO_PUBLIC_IOT_API_KEY=your_secret_key
EXPO_PUBLIC_MOBILE_WS_TOKEN=your_ws_tokennpx expo startScan the QR code with Expo Go. Ensure your phone is on the same WiFi network as the backend machine.
Validates the full pipeline: ingestion → Redis → worker → PostGIS → WebSocket alerts.
cd backend
export API_URL="http://localhost:8000"
export NUM_SENSORS=150
export CONCURRENCY_LIMIT=50
python -m tests.stress_testThree phases:
| Phase | What it tests |
|---|---|
| 🔥 Phase 1 — Firehose | 150 concurrent sensors, rate limiter validation |
| ⚔️ Phase 2 — Security | Bad signature blocked (401), Replay attack blocked (403) |
| 🔍 Phase 3 — E2E | DB persistence verified via polling GET /sensors/{id}/statistics |
A successful run ends with 🏆 SYSTEM CERTIFIED.
Trigger a simulated earthquake instantly from Swagger UI without running the stress test:
POST /demo/trigger-earthquakeDefault payload (works with empty {}):
{
"zone_id": 1,
"magnitude": 7.5,
"message": "Simulated Critical Event"
}This publishes directly to the Redis quake_alerts channel, bypassing the IoT pipeline entirely and triggering the mobile app alert UI within milliseconds.
The database is pre-seeded with 8 global macro-regions. Sensors are automatically assigned to the correct zone via PostGIS spatial query at registration time.
| Zone | Coverage |
|---|---|
| Italy - North | Lombardy, Veneto, Piedmont |
| Italy - Center | Tuscany, Lazio, Umbria |
| Italy - South & Islands | Campania, Sicily, Sardinia |
| Western Europe | France, Spain, Germany, UK |
| North America | USA, Canada, Mexico |
| South America | Brazil, Argentina, Chile |
| East Asia | China, Japan, India |
| Unknown Region | Fallback for unmapped coordinates |
| Workflow | Trigger | Checks |
|---|---|---|
backend-ci.yml | backend/** | Bandit, Safety, stress test |
frontend-ci.yml | mobile/** | ESLint, npm audit |
iot-ci.yml | firmware/** | PlatformIO compilation |
pr-lint.yml | All PRs | Semantic PR title (type(scope): message) |
devops-ci.yml | .github/workflows/** | Actionlint workflow validation |
QuakeGuard/
├── backend/
│ ├── src/
│ │ ├── main.py # FastAPI gateway + REST endpoints
│ │ ├── security.py # ECDSA, API Key, Anti-Replay
│ │ ├── worker.py # Redis consumer + magnitude + alert engine + AI enqueue
│ │ ├── ai_report_worker.py # Dedicated AI report consumer (Ollama + state machine)
│ │ ├── ollama_client.py # Deterministic LLM client (anti-hallucination)
│ │ ├── mqtt_subscriber.py # MQTT to HTTP bridge
│ │ ├── seed.py # Geographic zone seeder
│ │ ├── models.py # SQLAlchemy ORM models (+ EmergencyReport)
│ │ ├── schemas.py # Pydantic request/response schemas
│ │ └── database.py # DB engine and session factory
│ ├── tests/
│ │ ├── stress_test.py # Critical E2E stress test suite
│ │ └── unit/ # Unit tests (worker, ollama client, AI worker, models, ...)
│ ├── init-scripts/
│ │ └── ollama-entrypoint.sh # Auto-pulls the Ollama model on startup
│ ├── build.ps1 # Automatic container publish
│ ├── docker-compose.yml
│ ├── Dockerfile
│ ├── mosquitto.conf
│ ├── grafana/ # Grafana provisioning (datasource + dashboard JSON)
│ ├── requirements.txt # Python requirements for backend development| Version | Focus |
|---|---|
| v1.0 | ✅ Released — edge seismic detection on ESP32, local alerts |
| v1.1 | ✅ Released — HiveMQ Cloud MQTT (TLS), ngrok HTTPS tunnel, security hardening |
| v1.2 | ✅ Released — On-Premise AI Worker (Local Ollama / Llama 3.2) for privacy-preserving emergency reports |
| v1.2.1 | ✅ Released — Geo-Zoning & Cooldown Fragmentation — geohash Redis zone index (FastAPI/PostGIS source of truth), per-area cooldown, GNSS-ready data model (Sensor.last_fix_at, Reading.lat/lon), per-zone live seismograph |
| v1.2.2 | ✅ Released — Zero-Trust Serial Fallback — signed telemetry over USB CDC (serial) when MQTT is unreachable |
| v2.0.0 | ✅ Released — Triangulation (multi-node spatial correlation), Hybrid Network Architecture, Automated DevOps Orchestration (Ptyxis), Local Factory Provisioning, GNSS sync, NTP+PPS, ADXL calibration, and INGV FDSN SIL validation |
| v2.0.1 | ✅ Released — Documentation & Zenodo Sync: PDF/Wiki architectural coherence (Cloudflare, 300s anti-replay), CERN-OHL hardware licensing, SIL vs Firmware threshold clarification, and CITATION.cff bump |
| v2.1.0 | ✅ Released — System Telemetry & Grafana Observability, Captive Portal, Dynamic Demo Onboarding (QR), OTA In-App Updater, Local Mosquitto architecture, Repository Health: Dependabot, ADRs, C4/sequence diagrams, multi-stage Dockerfile, firmware versioning, pinout, flashing guide, hardware compliance |
| v2.1.1 | ✅ Released — Demo Calibration & Repository Fixes |
| v2.2 | Heterogeneous Edge Intelligence — hybrid Tier A (STA/LTA) + Tier B (quantized CNN) decision fusion |
| Future | Cloud IaC — Kubernetes + Terraform auto-scaling platform (see ROADMAP.md) |
| Node | Focus |
|---|---|
| #Research | Parallel ongoing node — SIL cross-validation: replay of the exact production C++ STA/LTA core (DetectionCore.h) on the host via the same C++ source, Python-only as orchestrator, ROC metrics + AI benchmarking (latency P50/P99, hallucination rate). R1 pipeline (core isolation, host CLI, orchestrator, metrics, calibration) implemented; see ROADMAP.md |
QuakeGuard's architecture and real-world applicability have been recognized in the following academic and industrial contexts:
This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0). See the LICENSE file for details.
Hardware designs (hardware/) are licensed under the CERN Open Hardware Licence v2 — Strongly Reciprocal (CERN-OHL-S-2.0).
See hardware/LICENSE for details.
⚠️ Hardware Compliance: The QuakeGuard PCB is not certified for CE/FCC/RoHS. It is intended for prototyping, educational, and research use only. Do not deploy as a commercial safety-critical device without appropriate regulatory certification.
Developed by GiZano and riccardo0731
Open Source — AGPL-3.0 License
| Qty | Value | Footprint | References |
|---|---|---|---|
| 3 | 330Ω | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R1, R2, R3 |
| 2 | 10µF | Capacitor_THT:CP_Radial_D5.0mm_P2.50mm | C1, C3 |
| 1 | 0.1µF | Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P5.00mm | C2 |
| 1 | ADXL345 | Connector_PinSocket_2.54mm:PinSocket_1x08_P2.54mm_Vertical | J3 |
| 1 | Blue | LED_THT:LED_D5.0mm | D2 |
| 1 | ESP32-C3[L] | Connector_PinSocket_2.54mm:PinSocket_1x08_P2.54mm_Vertical | J1 |
| 1 | ESP32-C3[R] | Connector_PinSocket_2.54mm:PinSocket_1x08_P2.54mm_Vertical | J2 |
| 1 | Green | LED_THT:LED_D5.0mm | D1 |
| 1 | NEO-6M | Connector_PinSocket_2.54mm:PinSocket_1x05_P2.54mm_Vertical | J4 |
| 1 | Red | LED_THT:LED_D5.0mm | D3 |
The 13 most common of 17 parts.

telagod/moskill
MosKill - Smart Mosquito Swatter with BLE, Kill Counting & Statistics | ESP32-C3 + KiCad PCB + UniApp



maddevsio/mad-navigator
Mad navigator is simple compass-like device shows direction to predefined geo point. This repository contains firmware source code and schematics for device.


atx/gps-freq-counter
Frequency counter using a GPS receiver PPS output as its reference

equipeantares/TelemetriaAuroraIII
Repositório para desenvolvimento do sistema de telemetria do foguete Aurora III da equipe extracurricular de foguetemodelismo da UNICAMP Antares

It measures 61.3 × 89.6 mm and has 2 copper layers, 1.6 mm thick.
17 parts, built around the ESP32-C3-LYRA, NEO-6M and ADXL345-EP. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the GiZano/QuakeGuard repository on GitHub, at the commit this page was made from: the board is hardware/QuakeGuard_PCB/QuakeGuard_PCB.kicad_pcb and its schematic hardware/QuakeGuard_PCB.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the AGPL-3.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).