Skip to the content
2 layers56 × 56.5 mmNX LSM6DS3, the printed circuit board in 3D

Acquisition and processing server for the NexaSeis collaborative seismic network

Size
56 × 56.5 mm
Copper layers
2
Thickness
1.6 mm
Parts
25
Nets
34
Pads
114
Tracks, vias
326, 23
Pours
1
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
16 Aug 2026
Updated
14 Oct 2026

Overview

NX LSM6DS3 is an open-source printed circuit board by Domiko7, from the Domiko7/NexaSeis repository on GitHub, published under the AGPL-3.0 licence. It is a 2-layer board of 56 × 56.5 mm with 25 parts on 34 nets, routed with 326 tracks and 23 vias.

It is built around the ESP32-C3-WROOM-02-H4, AMS1117-3.3 and LSM6DS3. Its parts include 7 resistors, 4 diodes, 3 capacitors, 3 ICs and 2 connectors. It belongs with the ESP32 and RISC-V boards of this library.

Main components

3

README

README.md

NexaSeis

An open-source, collaborative seismic monitoring network built around affordable ESP32-based stations.

[!WARNING] NexaSeis is incomplete and under active development. Expect unfinished features, breaking changes, and limited documentation. Do not rely on it for safety-critical earthquake monitoring or emergency alerts. Of the projects in seismometer/, only NX-1D is currently complete; NX-LSM6DS3 and NX-ADXL355 remain unfinished.

Overview

NexaSeis collects waveform samples from networked seismometers, processes and stores them, and makes live station data available to other applications. This repository contains the complete stack:

  • a Python ingestion and processing server;
  • a Vue web interface for viewing the network and individual stations;
  • firmware and KiCad design files for several ESP32-based seismometers;
  • optional WebSocket, DataLink, SeedLink, and REST API services.

The server can be installed as a Python package, while its runtime behavior and station inventory remain controlled by a JSON configuration file.

How it works

text
ESP32 station ──UDP/TCP──> Python server ──> signal processing ──> SQLite
                                │
                                ├──> REST API / helicorders
                                ├──> WebSocket stream
                                ├──> DataLink
                                └──> SeedLink

Stations send fixed-size binary packets containing a timestamp, station identifiers, and five signed integer samples. The server matches each packet to a station in src/config.json, applies its channel sensitivity and sample rate, buffers the waveform, calculates ground-motion values, and dispatches the result to enabled outputs.

Repository layout

PathPurpose
src/nexaseis/Python server, processing pipeline, database, and services
src/config.jsonServer, station, and output configuration
nexaseis-web/Vue 3, Vuetify, and Vite web application
seismometer/NX-1D/Complete ESP32 firmware for the ADS1256-based one-axis station
seismometer/NX-LSM6DS3/Unfinished ESP32 firmware and KiCad hardware files for LSM6DS3 stations
seismometer/NX-ADXL355/Unfinished ESP32/ADXL355 firmware project
fdsnws/stations/FDSN StationXML metadata
scripts/Development and integration helper scripts

See the seismometer guide for hardware status, NX-1D setup, and important filter limitations.

For a practical overview of the hardware, read How to build a DIY seismometer.

Requirements

Server

  • Python 3.11 or newer
  • obspy
  • websockets
  • simpledali
  • simplemseed
  • uvicorn
  • fastapi[standard]
  • numpy

SQLite support is provided by Python's standard library and does not need a separate package.

Web application

  • Node.js 20.19+ or 22.12+
  • npm

Firmware

  • PlatformIO
  • an ESP32 development board
  • the sensor and electronics appropriate for the selected hardware variant

Server setup

  1. Create and activate a virtual environment:

    bash
    python3 -m venv .venv
    source .venv/bin/activate
  2. Install NexaSeis and its runtime dependencies in editable mode:

    bash
    python -m pip install --upgrade pip
    python -m pip install -e .
  3. Edit src/config.json. At minimum, change data_path to an absolute directory writable by the server process and configure the station records you intend to receive.

  4. Start the server from the repository root:

    bash
    ./run.sh

    The installed command and equivalent module command are:

    bash
    nexaseis
    python -m nexaseis

By default, a source checkout reads src/config.json. To keep configuration elsewhere, set NEXASEIS_CONFIG to its path before starting the server:

bash
export NEXASEIS_CONFIG=/absolute/path/to/config.json
nexaseis

With the checked-in example configuration, the server listens on:

ServiceDefault addressPurpose
UDP ingest0.0.0.0:50006Receives station packets
REST API0.0.0.0:50010Station state and helicorder images
WebSocket0.0.0.0:50007Streams processed packets
DataLink127.0.0.1:16000Forwards waveform data to a DataLink server
TCP ingest0.0.0.0:50005Optional TCP packet input; disabled by default
SeedLink0.0.0.0:18000Optional SeedLink service; disabled by default

Binding to 0.0.0.0 exposes a service on every network interface. Use a firewall and more restrictive bind addresses where appropriate.

Station configuration

Each entry in the stations array identifies a station by its network, code, and location. Channels define their own calibration and sampling parameters:

json
{
  "name": "Example Station",
  "network": "XX",
  "code": "TEST",
  "location": "00",
  "channels": {
    "EHZ": {
      "sensitivity": 5408390926,
      "sample_rate": 100
    }
  },
  "lat": 52.0,
  "lon": 21.0,
  "elevation": 100
}

The network, station, location, and channel values sent by the device must match this configuration. Restart the server after changing the file; configuration is loaded at startup.

API

When the API is enabled, interactive OpenAPI documentation is available at http://localhost:50010/docs.

Useful endpoints include:

  • GET / — health and server time;
  • GET /stations — latest processed values, grouped by station;
  • GET /helicorder/{network}/{code}/{location}/{channel}?type=standard — generated helicorder image. type may be standard, teleseismic, or raw.

Waveform packets are persisted to nexaseis.db beneath the configured data_path.

Web application

Run the development server:

bash
cd nexaseis-web
npm ci
npm run dev

Create a production build:

bash
npm run build

The compiled application is written to nexaseis-web/dist/. Preview it locally with npm run preview.

Firmware

Only seismometer/NX-1D/ is currently considered complete. The NX-LSM6DS3 and NX-ADXL355 directories contain unfinished development work and should not be expected to build or function correctly.

Read seismometer/README.md before configuring the firmware. It documents the required NX-1D settings and the sensor-specific limitations of its compensation and high-pass filters.

Open the NX-1D directory as a PlatformIO project. Before uploading, review its include/settings.h and source files for Wi-Fi credentials, station identifiers, server address, sensor pins, and calibration values.

Build the NX-1D firmware from the command line:

bash
cd seismometer/NX-1D
pio run

Connect the target ESP32 and upload with:

bash
pio run --target upload
pio device monitor

Never commit real Wi-Fi credentials or other secrets. Keep local values in ignored files or inject them through PlatformIO build settings.

Development checks

The web application provides the currently configured automated checks:

bash
cd nexaseis-web
npm run lint
npm run build

There is not yet an automated Python or firmware test suite. When changing the server, verify startup with a writable data_path and exercise the relevant input/output service.

License

NexaSeis is licensed under the GNU Affero General Public License v3.0.

Parts

25
QtyValueFootprintReferences
4MountingHoleMountingHole:MountingHole_3.2mm_M3_PadH1, H2, H3, H4
2330Resistor_SMD:R_0805_2012MetricR6, R7
24.7kResistor_SMD:R_0805_2012MetricR1, R2
25.1kResistor_SMD:R_0805_2012MetricR4, R5
2D_SchottkyDiode_SMD:D_SOD-123D1, D2
110kResistor_SMD:R_0805_2012MetricR3
110uFCapacitor_SMD:C_0805_2012MetricC2
11uFCapacitor_SMD:C_0805_2012MetricC1
122uFCapacitor_SMD:C_0805_2012MetricC3
1AMS1117-3.3Package_TO_SOT_SMD:SOT-223-3_TabPin2U3
1BLUELED_SMD:LED_0805_2012MetricD4
1ESP32-C3-WROOM-02RF_Module:ESP32-C3-WROOM-02U1
1LOGONX-LSM6DS3:full_logoG***
1LOGONX-LSM6DS3:logoG***
1LSM6DS3Package_LGA:LGA-14_3x2.5mm_P0.5mm_LayoutBorder3x4yU2
1REDLED_SMD:LED_0805_2012MetricD3
1Screw_Terminal_01x02TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-2_1x02_P5.00mm_HorizontalJ2
1USB_C_Receptacle_USB2.0_16PConnector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12J1

Similar boards

  • 4 layers25.6 × 23.6 mmCANNONBALL, the printed circuit board in 3D

    CANNONBALL

    user-will/PCB_CANNONBALL

    An ESP32-C3 dev board with more sensors and features then you could know what to do with

    61 parts14
  • 2 layers45 × 42.5 mmWhaap, the printed circuit board in 3D

    Whaap

    bardiasayyar/Custom-PCB-Wearable-Step-Fall-Tracker

    Designing a custom wristband PCB in KiCad integrating an ESP32-C3 microcontroller, LSM6DS3 IMU (I2C), and LiPo battery/charging circuitry for real-time step counting, fall detection, and battery monitoring.

    31 parts
  • 4 layers145 × 71.3 mmALL PCBS, the printed circuit board in 3D

    ALL PCBS

    NYDEREK/LineFollower_GRUZIK3.0

    Loved the project? Please consider giving a Star ⭐️

    142 parts15
  • 2 layers94 × 94 mm3axis magnitometer, the printed circuit board in 3D

    3axis magnitometer

    NarodniySputnik/Gladiolus-1

    Gladiolus-1 - автономный модуль для приема и передачи изображений в формате SSTV (Slow Scan TeleVision) на малом космическом аппарате (МКА) формата CubeSat

    96 parts9GPL-3.0
  • 2 layersDrone controller, the printed circuit board in 3D

    Drone controller

    C-monC/Drone-simluation

    Experimenting with reinforcement learning for drone control.

    12 parts
  • 4 layers57.1 × 33.9 mmSabiaR1 v2, the printed circuit board in 3D

    SabiaR1 v2

    CarloCBragagnolo/SABIAR1

    Project files for the Sabiá R1 flight computer

    64 partsGPL-3.0
  • 4 layers66 × 76.2 mmFreeEEG32-alpha2, the printed circuit board in 3D

    FreeEEG32-alpha2

    neuroidss/FreeEEG32-alpha2

    209 partsAGPL-3.0

Questions

How big is the NX LSM6DS3 PCB?

It measures 56 × 56.5 mm and has 2 copper layers, 1.6 mm thick.

What parts does the NX LSM6DS3 use?

25 parts, built around the ESP32-C3-WROOM-02-H4, AMS1117-3.3 and LSM6DS3. 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.

Where can I download the NX LSM6DS3 KiCad files?

From the Domiko7/NexaSeis repository on GitHub, at the commit this page was made from: the board is seismometer/NX-LSM6DS3/pcb/NX-LSM6DS3/NX-LSM6DS3.kicad_pcb and its schematic seismometer/NX-LSM6DS3/pcb/NX-LSM6DS3/NX-LSM6DS3.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the NX LSM6DS3 design in my own project?

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).