NetGest

Full-Stack Developer2024 - Present
Active
AdonisJSReactPostgreSQLDockerNginx

NetGest is the operations platform I built for a WISP (Wireless Internet Service Provider) in Venezuela. It replaces spreadsheets, disconnected tools, and manual processes with a single system that covers the full operational cycle.

NetGest operations dashboard showing KPIs, recent activity feed, and network health
Executive dashboard: active clients, open tickets, overdue invoices, and real-time network health
Platform domains
NetGest
├── Customers ─── plans, installations, service lifecycle
├── Billing ───── invoices, payments, aging reports, analytics
├── Tickets ───── support cases, escalation, SLA tracking
├── Visits ────── field dispatch, OSRM routing, technician agenda
├── Monitoring ── multi-protocol probes, topology, alerts, SSE
├── Reports ───── KPIs, billing analytics, performance targets
├── IAM ───────── 7 roles, granular permissions, audit log
└── System ────── notifications, email, PDF pipeline, scheduler

Why custom

Everything in a WISP is connected. A customer has service plans tied to physical installations, which connect to network devices at specific sites. When a device goes down, the affected customers should be visible. When a ticket escalates, it becomes a field visit that needs scheduling and routing. When an invoice is generated, it pulls from the plan pricing. Off-the-shelf CRMs can't model these relationships well.

Architecture

The system is a monorepo with npm workspaces: a standalone AdonisJS API, a React SPA, and a shared contracts package that enforces permission names and types across both sides.

Infrastructure
Docker Compose
├── api          ── AdonisJS 6, Lucid ORM, PostgreSQL
├── scheduler    ── separate Adonis process for cron jobs
├── web          ── React 19, Vite 7, TanStack (Router/Query/Table/Form)
├── postgres     ── PostgreSQL 16
├── osrm         ── OpenStreetMap routing engine (Venezuela extract)
├── mailpit      ── SMTP for dev email
└── browserless  ── headless Chrome for PDF generation

Billing

The billing system runs on a scheduler. Invoices generate automatically based on active plans, overdue accounts get flagged, and the analytics workspace breaks it down:

  • Aging and risk -- debt by age bucket, overdue amounts, average delinquency days
  • DSO and trends -- Days Sales Outstanding tracking over time
  • Collection performance -- payment behavior, collection rates
  • Invoice lifecycle -- status distribution, processing times
  • Tax breakdown and revenue mix -- by plan type and period
  • All reports export to Excel with configurable date windows
NetGest billing analytics showing aging buckets, overdue amounts, and debt distribution
Aging & risk report: debt by age bucket, average delinquency, and quick context sidebar

Support and field operations

Tickets link to customers, plans, and network nodes. They can escalate to technical visits, which feed into a dispatch system. Supervisors assign visits, and technicians see a daily agenda with an optimized route map.

The routing is powered by OSRM running against local OpenStreetMap data -- it calculates real driving distances and ETAs between stops, not straight-line estimates.

Monitoring

The monitoring subsystem tracks devices across sites using multiple protocols:

  • ICMP -- basic up/down ping checks
  • SNMP -- interface stats, bandwidth, hardware metrics
  • HTTP/API -- MikroTik router health via REST, including PPPoE session management

Devices are organized in a topology with two views: a Leaflet map showing geographic site positions, and a React Flow graph showing logical dependency chains per site. Dependency links drive alert suppression -- if an upstream device goes down, downstream alerts are suppressed to reduce noise.

Status changes push to the frontend via SSE and trigger in-app notifications.

NetGest site topology graph showing devices, dependency links, and live status indicators
Site topology: dependency graph with live status — a downed PTP link cascades degraded state downstream

Access control

Seven roles mapped to granular permissions: admin, tier 2 tech, field supervisor, tier 1 tech, customer service, accountant, cashier. The contracts package is the single source of truth -- permission names defined once, enforced in both API middleware and frontend route guards.

Other systems

  • Customer email -- outbound SMTP with MJML templates, sanitized HTML, delivery tracking
  • Audit log -- filterable event history with export, retention scheduling
  • PDF generation -- invoices and reports rendered
  • Notifications -- DB-backed with SSE delivery, triggered by scheduler events and operational actions
  • KPIs -- operational performance dashboard with configurable targets