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.
Canopy Height Assessment: A Machine Learning Approach Using PlanetScope High-Resolution Images
2026Status: Work in ProgressFeatured Project
MSc dissertation modeling forest canopy height from PlanetScope high-resolution imagery using a stacking ensemble trained against GEDI spaceborne LiDAR.
Developed at NOVA University Lisbon (Electrical and Computer Engineering), the model combines 9 base regressors (Random Forest, XGBoost, LightGBM, Extra Trees, SVR, Ridge, Lasso, ElasticNet and KNN) through a Ridge meta-learner, trained on 99 spectral, texture and terrain features. Validated over two Portuguese forest areas (Monsanto and Serra da Lousã) against GEDI rh98 reference heights.
Tech Highlights
Stacking ensemble of 9 regressors combined via a Ridge meta-learner, with a per-pixel uncertainty estimate.
99 input features spanning PlanetScope 8-band reflectance, GLCM texture and terrain derivatives.
Trained and validated on GEDI spaceborne LiDAR (rh98) across two Portuguese forest study areas.
Model Performance
32.69%rRMSE (5-fold CV)
0.679Pearson r
9Base models
99Input features
Architecture
PlanetScope 8-band Surface Reflectance composites paired with GLCM texture and DGT LiDAR-derived terrain features.
GEDI rh98 relative-height footprints (optimized) used as ground-truth training reference.
9 base regressors (RF, XGBoost, LightGBM, Extra Trees, SVR, Ridge, Lasso, ElasticNet, KNN) trained independently on 99 features.
Ridge meta-learner stacks the 9 base predictions into a single final height estimate.
Per-pixel uncertainty reported as the standard deviation across the 9 base predictions.
Standalone inference script applies the trained ensemble to new co-registered raster stacks.
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.
Tech Highlights
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.
Live Metrics
—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.
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.
Tech Highlights
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.
Live Metrics
—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.
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.
Tech Highlights
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.
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.
Tech Highlights
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.