Personal project
VIGIA
An operational picture that connects incidents to the decisions around them.
- Built with
- Node.js · PostGIS · MapLibre · OSRM · Docker
- Context
- Independent system · Portugal first
Behind the interface
Architecture & tools.
Source adapters feed an operational model that separates observations from consequences and planning. The public console reads through a restricted gateway backed by the API and geospatial storage.
- Runtime & data
JavaScript · Node.js · PostgreSQL · PostGIS
Run the API and domain engines with durable spatial queries and a shared operational model.
- Maps & routing
MapLibre · OSRM
Render geographic context and support route analysis around incidents and restrictions.
- Packaging
Docker · Docker Compose · esbuild
Build the web surface and isolate API, operator and supporting services in repeatable environments.
- Verification
Node.js test runner · fast-check
Exercise domain invariants with property tests and dedicated race, crash and replay checks.
- 01
Observe
Normalize source data with provenance and freshness.
- 02
Connect
Relate incidents, facilities and route restrictions.
- 03
Evaluate
Apply deterministic consequence and planning logic.
- 04
Inspect
Present the result in a read-only operator console.
Provenance, stale data and uncertainty remain part of the model. The public gateway exposes a restricted evaluation surface; it does not authorize dispatch or certify safe routes.

The challenge
A map can show an incident without explaining its consequences. An operator also needs to know which roads and facilities matter, what changed, what support is available, and what remains uncertain.
Decisions that shaped the product
Interaction study
When information expires.
A simplified, fictional observation. No live incident or route data.
Road access observation
Source: demonstration feed · Updated 2 minutes ago
The source and age are visible before the observation can be inspected.
This study uses a 15-minute expiry to show the transition. It does not specify the product’s source-specific freshness policy.
Start with what changed.
Incident context, affected services and the next useful inspection stay close to the operational view, so the map supports the task rather than becoming the task.
The tradeoff. A focused incident view exposes less information at once than an all-layers dashboard.
Keep uncertainty visible.
Observations carry provenance and freshness. Expired information cannot silently continue to look current.
The tradeoff. A clear unknown can be less visually satisfying than a definitive answer, but it is the more useful state.
Give the public demo a firm boundary.
The portfolio experience exposes a controlled evaluation of the console and its decision logic. Unsupported operational actions stay unavailable.
The tradeoff. The public experience cannot represent every production integration or field condition.
The outcome
An explorable operator interface supported by consequence and planning logic. The public portfolio scenario lets visitors inspect the product’s decisions without treating it as an operational emergency system.
The public demo is an evaluation surface. Its scenarios do not establish current emergency conditions, safe passage or dispatch authority. Availability depends on its separate deployment.
Next case study
Mirror AI