Skip to main content

Real-time desktop seismic alert agent, impossible to ignore (EMSC push + USGS backup).

Project description

🌐 Vigía-eew

Real-time earthquake alerts for your desktop. Impossible to ignore.

What is it?

Vigía (vigia-eew) is a cross-platform desktop agent that monitors earthquakes in real time and fires an alert that can't be ignored or dismissed by accident.

It connects over WebSocket to the EMSC real-time feed (push — no constant polling) and uses the USGS FDSN service as a reconciliation fallback so no event is missed. When an earthquake occurs within your configured radius, Vigía instantly displays its magnitude, location, distance from your reference point, and depth — and stays on screen until you explicitly acknowledge it.

It runs on Linux, Windows, and macOS, with no API keys, no paid services, and no dependency on any phone.

Why?

A regular desktop notification gets silenced by Do Not Disturb, dismissed with a stray click, or buried behind other windows. In a seismic emergency, that's exactly what must not happen. Vigía forces an alert window to the front, with sound scaled to severity, that only disappears once you confirm you've seen it.

It was born in the aftermath of the June 2026 Venezuela earthquake, with a clear goal: a self-hosted, free, and robust tool that each machine can run on its own, with no single point of failure. Depending on your distance from the epicenter, the notification may reach you before the most destructive seismic waves; and even when it doesn't, it guarantees the alert isn't missed and is logged.

Key features

  • 🛰️ Real WebSocket push (EMSC) as the primary channel — no constant polling.
  • 🔁 REST fallback (USGS FDSN) that reconciles and recovers anything the WebSocket may drop.
  • 🇻🇪 FUNVISIS local coverage (Venezuela only): polls the Venezuelan national network so the small local quakes (M2–3) that EMSC/USGS don't catalog still trigger alerts. Polling (no push); enabled by default, harmless elsewhere (its events fall outside your radius).
  • 🚨 Non-dismissable alert: a front-most window, with sound, that only closes on acknowledgment.
  • 📍 Configurable geographic filter: reference point, radius in km, and minimum magnitude — auto-detected by IP geolocation if you don't set one manually.
  • 🌎 Optional country filter: only notify earthquakes in your own country (offshore/coastal quakes kept), determined offline — opt-in, off by default.
  • 🟢 Cross-platform: Linux, Windows, and macOS, with autostart on login.
  • 📦 Full distribution: PyPI, .exe, .dmg, AppImage, .deb, .rpm.
  • 🧪 --simulate mode to test the alert without waiting for a real earthquake.
  • 🖥️ System tray icon: connection status, last alert, pause/resume notifications, edit config, quit — best-effort, never blocks startup if unavailable on your desktop.
  • ⌨️ Headless TUI dashboard (--tui): run the agent on a server over SSH with no display — a terminal dashboard with live status, an alerts log, and a non-dismissable modal alert (ENTER acknowledges). Combine with --simulate to test it.

Installation

There are two ways to install Vigía: a prebuilt package (recommended for everyday desktop use) or from source (for development or unsupported platforms).

Option A — Prebuilt package (recommended)

Download the artifact for your OS from the latest GitHub Release. No Python installation is required — the binary is self-contained.

OS Artifact Install
Linux vigia-eew-*-x86_64.AppImage chmod +x vigia-eew-*.AppImage && ./vigia-eew-*.AppImage
Linux (Debian/Ubuntu) vigia-eew_*_amd64.deb sudo apt install ./vigia-eew_*_amd64.deb
Linux (Fedora/RHEL) vigia-eew-*.x86_64.rpm sudo dnf install ./vigia-eew-*.x86_64.rpm
Windows vigia-eew.exe Double-click, or run it from a terminal.
macOS vigia-eew-*.dmg Open the .dmg and drag the app to Applications.

The .deb/.rpm packages install a vigia-eew command on your PATH; the AppImage, .exe, and .app are run directly.

Option B — From source (Python 3.11+)

Requires Python 3.11 or newer. With uv (recommended):

git clone https://github.com/ecrespo/vigia-eew.git
cd vigia-eew
uv venv && uv pip install -e .        # add ".[dev]" for the test/lint tooling
uv run vigia-eew --help

Or with plain pip:

python -m venv .venv && source .venv/bin/activate   # Windows: .venv\Scripts\activate
pip install -e .
vigia-eew --help

If your release also publishes to PyPI, pipx install vigia-eew (or pip install vigia-eew) works too — PyPI upload is optional in CI, so check the release notes.

Configuration

Vigía runs with sensible defaults centered on Caracas and needs no configuration to start. To customize it, create a config.toml. On first run Vigía auto-creates one from the bundled template at the path below; you can also copy config.toml.example there by hand and edit it.

Where the file lives (the default location Vigía reads on startup):

OS Path
Linux ~/.config/vigia-eew/config.toml
macOS ~/Library/Application Support/vigia-eew/config.toml
Windows %LOCALAPPDATA%\vigia-eew\config.toml

You can also point at any file explicitly with --config <path>. From the desktop tray icon, "Edit configuration…" opens the file currently in use (creating it from the template if needed).

Most useful settings (see config.toml.example for the full schema):

[reference]                 # your location; delete this whole section to auto-detect by IP
name = "Caracas"
lat = 10.4806
lon = -66.9036

[filter]
radius_km = 300.0           # only alert on earthquakes within this radius
min_magnitude = 2.5         # raise to ignore smaller quakes (e.g. 3.0)
country_filter = false      # true = don't notify quakes in *other* countries (offshore kept)
country = "auto"            # "auto" derives it from the reference point, or set "VE", "CO", ...

[notification]
fullscreen = false          # make the alert take the whole screen
sound = true                # play a severity-scaled sound
tray_icon = true            # show the system tray icon (best-effort)
language = "auto"           # "auto" = detect from OS locale; or "en" / "es"
  • Location — set [reference] manually, or delete/comment the whole section to have Vigía detect your location by IP on first startup (cached afterwards).
  • What triggers an alertradius_km and min_magnitude in [filter].
  • Only my country — set [filter] country_filter = true to suppress earthquakes in other countries (offshore/coastal quakes are kept). Off by default.
  • Language[notification] language ("auto", "en", or "es").
  • FUNVISIS (Venezuela)[sources.funvisis] polls the Venezuelan network for local quakes EMSC/USGS miss. Enabled by default; it only reports Venezuelan events (harmless elsewhere — they fall outside your radius) and it's polled over plain HTTP (FUNVISIS has no HTTPS). Set enabled = false to turn it off.

Validate a config without starting the agent:

vigia-eew --check-config              # uses the default path
vigia-eew --config ./my.toml --check-config

Usage

On the desktop (default)

Just run it — from the launcher (packaged app) or the console:

vigia-eew

Vigía starts in the background and connects to the feeds. From then on:

  • When a qualifying earthquake occurs, a front-most, non-dismissable alert window appears with sound, showing magnitude, place, distance, and depth. It stays until you click ACKNOWLEDGED — a stray click, Esc, or the window's X won't close it.
  • A system tray icon shows connection status and the last alert, and lets you pause/resume notifications, edit the configuration, or quit (best-effort; if your desktop can't show a tray icon, the agent still runs).

Start automatically on login (installs a systemd user service / LaunchAgent / scheduled task, depending on the OS):

vigia-eew --install-autostart
vigia-eew --uninstall-autostart   # to remove it

Test the alert without waiting for a real earthquake (injects a simulated M6.1 near La Guaira):

vigia-eew --simulate

From the console (CLI)

Run vigia-eew --help to see every flag:

Flag What it does
(none) Start the full agent with the desktop GUI + tray icon.
--tui Run the headless terminal dashboard instead of the desktop GUI (for servers over SSH with no display).
--simulate Inject a simulated earthquake to test the alert. Combine with --tui.
--config <path> Use a specific config.toml.
--check-config Validate the configuration and print the reference point, then exit.
--install-autostart / --uninstall-autostart Install/remove autostart on login.
--version Print the version and exit.

Headless / over SSH — the TUI dashboard:

vigia-eew --tui                # live status bar + alerts log in the terminal
vigia-eew --tui --simulate     # same, with a test alert to see the modal

The TUI shows the WebSocket connection status and a log of recent alerts. Each qualifying event opens a non-dismissable modal inside the terminal that only ENTER acknowledges (Esc is disabled — same "impossible to ignore" contract as the desktop window). Keys: p pause/resume notifications, q quit. There is no tray icon or toast in this mode.

Development

The project uses a src/ layout, so it must be installed in editable mode before running the tests or the CLI from a checkout (otherwise import vigia_eew fails).

With uv (recommended):

uv venv
uv pip install -e ".[dev]"      # runtime + dev deps (pytest, ruff, mypy)

Or with plain pip:

python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"

Then run the checks:

uv run pytest      # test suite
uv run ruff check .   # lint
uv run mypy src    # type check
uv run vigia-eew --help  # console entry point

Pre-commit hooks

The repo ships a .pre-commit-config.yaml that mirrors the CI gates locally. Enable it once per clone:

uv run pre-commit install     # registers the pre-commit and pre-push git hooks
  • On each commit (fast): file hygiene, ruff, mypy, bandit, gitleaks.
  • Before each push (slower): pytest, pip-audit, semgrep, trivy (trivy is best-effort locally — it runs only if the binary is installed; CI enforces it).

Run everything on demand: uv run pre-commit run --all-files (add --hook-stage pre-push for the push-stage hooks). These match .github/workflows/ci.yml and security.yml.


Built with Spec-Driven Development · Source and docs in Spanish

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vigia_eew-0.6.0.tar.gz (218.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

vigia_eew-0.6.0-py3-none-any.whl (182.3 kB view details)

Uploaded Python 3

File details

Details for the file vigia_eew-0.6.0.tar.gz.

File metadata

  • Download URL: vigia_eew-0.6.0.tar.gz
  • Upload date:
  • Size: 218.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for vigia_eew-0.6.0.tar.gz
Algorithm Hash digest
SHA256 d01673d55f977c1f6861979a9925589e0c7fcca66b8100b51e9bc262014a13fc
MD5 5d118f6c1c3ce0302bc8a6e776c8ca55
BLAKE2b-256 0acda254092a21e260654ae495e331e0f945eeeabba919912e055fa86f2ed86f

See more details on using hashes here.

File details

Details for the file vigia_eew-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: vigia_eew-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 182.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for vigia_eew-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7d139139d5204d7891d2d5a69e834715dbc95dff010cdc39eacb6abff589f9fe
MD5 6f645c951ef261a596c77273c21f0a96
BLAKE2b-256 898e8cbf8bb5f7c2553727967c491b8ee06d4964b878bc7003fe60dfdb089aaa

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page