Projects

Engineering-focused work in geospatial systems, applied AI workflows and production-ready web platforms. Each project is presented as a system: architecture, constraints, deployment and usage.

Modbench

2026 Status: Live
Modbench in the dark theme reading an energy meter through its device map Modbench reading every register of an energy meter by name, scaled and with units

A lightweight Modbus TCP/RTU client for Windows and Linux. Test any address by hand, or open a device map and read every register by name, already scaled, with units and labels.

Built for commissioning and troubleshooting field devices without retyping addresses from a PDF manual. Reads .mbmap device maps and browses the 400+ shared maps of the .mbmap library, checks reference values to catch a wrong address or byte order, and writes only through typed controls with limits from the map. Installers are about 2 MB on Windows and update themselves.

  • Serial RTU, Modbus TCP and RTU over TCP, any function code, with a raw frame view that shows every byte sent and received.
  • A read planner groups a map's registers into as few Modbus requests as possible, then decodes types, byte and word order, scaling, bit fields and state labels.
  • Scans for unit IDs or for the baud rate, parity and stop bits of a serial device, reconnects when a link drops, and records every cycle to CSV.
— Latest release
— Downloads
— Releases
Architecture
  • Tauri 2 app: a Rust core on tokio-modbus and tokio-serial does the I/O, a SvelteKit front end renders the UI.
  • modbench-cli reads devices from the terminal and serves the same operations over MCP, so AI assistants can read devices. It never writes.
  • A built-in simulator serves any map over Modbus TCP with changing values, for testing without hardware.
  • Signed releases from a tag: Windows .exe and .msi, Linux AppImage and .deb, an APT repository and in-app updates.
Rust Tauri SvelteKit TypeScript Modbus Industrial Automation Desktop MCP

.mbmap - ModBus Spec

2026 Status: Live

An open specification for Modbus register maps (.mbmap) and a public-domain library of over 400 device maps from nearly 100 manufacturers.

Each file describes one device model: the manufacturer, how to connect to it and what every register means. Load a map into a compatible tool and you get the device's variables already named, scaled and typed. The spec is JSON with a JSON Schema, so any language can read it, and the spec, maps and tools are all CC0.

  • Covers types, byte and word order, scale factors, bit fields, translation tables, sentinel values, write limits and the firmware versions a map fits.
  • Reference and identity registers let a tool check the map against the connected device before trusting it.
  • A shared conformance suite: valid, invalid and warning samples, each with the diagnostic codes any reader must produce.
— Device maps
— Manufacturers
— Registers described
Architecture
  • SPEC.md defines the format, with RFC 2119 wording; schema/ holds its JSON Schema for editor validation.
  • maps/<vendor>/<model>.mbmap.json, one register per line so each change is a one-line diff.
  • Python tools validate every map in CI, rebuild index.json for apps that browse the library, and migrate the older CSV-based format.
  • Maps converted from other open catalogues are marked unverified until someone checks them against the manufacturer's manual.
JSON Schema Python GitHub Actions Modbus Open Standard Open Data CC0

Cherubyte

2026 Status: Live
Cherubyte activity log in the dark theme: devices joining and leaving, open ports and presence changes Cherubyte dashboard: devices online now, presence and internet uptime above the list of every device on the network

Self-hosted LAN monitor that finds every device on your network, works out what each one is, tracks who is home and alerts you the moment something new appears. A free, private alternative to Fing.

Split into a panel and lightweight agents: agents scan each network, the panel keeps the history on hardware you already own. No account, no cloud; the inventory lives in a SQLite file that never leaves the LAN. Runs on a Raspberry Pi, a NAS or any Linux box.

  • Device identity fused from a dozen signals: mDNS, SSDP, NetBIOS, DHCP and TCP fingerprints, MAC vendor and HTTP banners.
  • Randomised MACs and multiple IPs fold into one device, so a phone that rotates its address stays a single row.
  • Alerts for new devices, rogue DHCP servers, gateway MAC changes and risky open ports, pushed via web push, Telegram, ntfy or email.
Architecture
  • Agents sit on each monitored LAN and do the raw-socket work: ARP sweeps, passive ARP, mDNS, SSDP and the neighbour table.
  • The panel (FastAPI + SQLite) stores history, classifies devices and raises alerts; it never touches a monitored network.
  • Agents send only observations, so better naming, presence and alerting ship as a panel upgrade to every agent in the field.
  • React + TypeScript PWA with web push (VAPID key generated on the box), in English or Portuguese, light or dark.
  • Integrations: Home Assistant via MQTT auto-discovery, a Prometheus scrape endpoint, SNMP/LLDP topology and Wake-on-LAN.
Python FastAPI TypeScript React SQLite Raspberry Pi Self-hosted Network Monitoring Privacy Home Assistant

Map11

2025 Status: Live
Map11 in the dark theme: football club crests across Lisbon Map11: football club crests across Lisbon

Community-driven geospatial football mapping platform combining automated data scraping, interactive visualization and user-generated contributions.

Built with Python scraping pipelines, Zerozero.pt ingestion flows, Cloudflare D1 and modern web mapping technologies. Structured as a continuously updated product with contributor input and deployment-ready architecture.

  • Automated ingestion pipeline for football clubs and location normalization.
  • Data model designed for community submissions and moderation workflows.
  • Geospatial rendering optimized for responsive and interactive usage.
— Clubs mapped
— Countries
— Monthly submissions
— Total contributions
Architecture
  • Python scraping pipeline orchestrates periodic source collection.
  • Zerozero.pt ingestion stage validates and transforms raw entities.
  • Cloudflare D1 persists club, location and contribution records.
  • Map rendering stack serves responsive interactive geospatial views.
  • Community contribution flow supports submission and review lifecycle.
  • Deployment architecture targets global edge delivery via Cloudflare.
Python JavaScript Cloudflare D1 Geospatial Web Scraping ETL Community Data