Portfolio

How AI and data-driven solutions can improve your business

Real problems, solved with data and AI. See how putting your own data to work, and AI where it pays, makes a business run better.

Waze Cargo

Machine learning

A machine-learning forecast of port congestion for Chilean importers and exporters. Trained on about twenty million customs records, it predicts each port’s monthly load a year ahead from its own history, adds the risk of the port closing to swell, and tells a shipper which port to use for each commodity.

customs records of imports and exports. Each one carries an HS code, so the forecast splits by commodity.
20M
ports, imports and exports, forecast month by month for the next 12 months.
23
accuracy in 2026 so far. We checked the forecast against the real shipments from January to May.
91.5%
accuracy at San Antonio, which handles 57% of Chile’s maritime imports. The busier the port, the better the forecast.
96.6%
Built with
  • Python
  • SQL
  • pandas
  • NumPy
  • scikit-learn
  • LightGBM
  • PostgreSQL
  • AWS
  • GitHub Actions
  • React
  • Leaflet
  • Recharts
  • Tableau
The Delay Risk Map

Import view, combined layer · 23 ports ranked

Waze Cargo: the national view. A map of Chile with the ports plotted and coloured by delay risk, beside a panel ranking 23 ports by weather-adjusted congestion, San Antonio highest at 78 per cent and Coquimbo lowest.

Every port at its real position, coloured by its predicted congestion. San Antonio handles 57% of the country’s maritime imports and runs hottest, which is why the answer is so often a different port.

A port’s year ahead

Valparaíso, imports · congestion forecast, 2026

Waze Cargo: Valparaíso selected. A monthly congestion forecast for 2026 against the port's own historical range, quietest in April at 21 per cent and busiest in July at 55 per cent, with the commodities that drive its traffic listed below.

Load forecast month by month against the port’s own record, so a planner can see the quiet months and the peak before booking.

Weather, by the month

San Antonio · vehicles and parts · weather layer

Waze Cargo: a single port. San Antonio selected, its weather risk broken down month by month with hours closed and the driving swell, and below it the twelve-month congestion forecast for vehicles and parts against shipment volume.

Hours the port is shut by swell, each month of a typical year, laid over the forecast for one commodity, which is the question an importer actually has.

Exports, and a better option

Arica · oil seeds · combined view

Waze Cargo: the export view. Arica selected for oil seeds, with its seasonal weather risk and a monthly forecast of shipments and congestion, and a note that San Antonio ranks first for this commodity at 48 per cent congestion.

For exporters too: it scores every port for the chosen commodity and says when another one is the better route.

Alma Secret

AI · API integration · CRM

Alma Secret, a Spanish dermocosmetics brand, launched this campaign on almasecret.cl and wanted it to do more than bring visitors to the site. Now a customer takes a selfie on her phone and gets an AI reading of her skin and a personal three-product routine from the brand’s own catalogue, with safety rules for pregnancy and sensitive skin built in. Every result goes to the brand’s CRM, so the follow-up is personal and each sale can be traced back to the analysis that started it. The brand’s own team runs it day to day, without touching code.

skin conditions read from one selfie.
13
products in her personal routine.
3
details saved to the CRM for each analysis, ready for the follow-up.
58
Built with
  • JavaScript
  • Node.js
  • Cloudflare
  • REST APIs
  • Make.com
  • GoHighLevel
The experience, start to finish

Selfie, skin map, scores and the routine, as the customer sees them · 40 seconds

The face is AI-generated, not a customer’s. Captions are in Spanish, the language of the brand’s customers.

people_counter

Computer vision

Live occupancy counting for bars and venues in Barcelona, where going over the licensed capacity means a fine. A camera and a Raspberry Pi count the people in the room every second with a computer-vision model, show the number and the night’s peak on a display the staff can see, and can feed a sign, a log or an alert. The video is processed on the device and never stored or sent anywhere, so no footage of customers leaves the building.

frames of video stored or sent off the premises.
0
second between counts, so the number on the display stays live.
1
camera works: a webcam, an IP camera or a recorded video.
Any
Built with
  • Python
  • YOLOv8
  • OpenCV
  • Raspberry Pi
What the camera sees

A bar terrace, every person boxed and counted · simulated scene

people_counter on a simulated bar terrace in Barcelona at night: twenty-eight people, each in a numbered green box, with a running total of 28 in the corner.

A simulated scene, not a client’s venue: the detections and the total are how the counter marks up what it sees.

What the staff see

The 16×2 panel the counter drives, on the bar

PEOPLE: 47 PEAK: 52 Source: rtsp://cam-01 Uptime: 04:12:38 FPS: 11.4

Drawn from the panel the Pi version renders. It can also drive a real LCD on the bar, or send the count on to a sign or a log.

Melus Grez Propiedades

Web · Admin panel

A broker in Santiago and Pichilemu whose listings lived on portals that diluted her brand and charged her for every lead. Her own site now: her properties only, each enquiry arriving on WhatsApp with the listing code already in the message, and a panel she runs from her phone.

Built with
  • JavaScript
  • React
  • Cloudflare
  • SQL
  • Leaflet
  • REST APIs
The first screen

Brand, featured property and search, without scrolling

Melus Grez Propiedades: the delivered homepage. A dark architectural cover carrying the wordmark and navigation, the headline Propiedades que se eligen con calma, a featured-property card for LBA-007 at UF 27,800 with four bedrooms on a 620 square metre plot, and a search bar offering buy or rent, zone, type and bedrooms.

Prices carry UF with the peso equivalent refreshed daily, and the map shows an approximate location so an owner’s address is never published.

Flight data service

Coursework · Data infrastructure

Built session by session over a term on the MSc infrastructure module, on a thousand-odd raw files of real aircraft tracking data. Not client work, and listed as what it is — but it is where the medallion layering, the orchestration and the CI that the client pipelines use were learned in the open.

Built with
  • Python
  • FastAPI
  • Airflow
  • AWS
  • MinIO
  • Parquet
  • dbt
  • DuckDB
  • PostgreSQL
  • MongoDB
  • Neo4j
  • Docker
  • GitHub Actions
How the data moves

Ingest, layer, model, serve — one DAG end to end

AIRFLOW · TASKFLOW DAG ADS-B feed FastAPI Bronze Silver Marts 1,000+ rawfiles Pydanticboto3 · s3fs object storeas landed Parquetpartitioned dbt onDuckDB PostgreSQLMongoDBNeo4j SQLAlchemyaggregationsCypher GITHUB ACTIONS ON EVERY PUSH Ruffpytest · 62Docker Buildx

Bronze and silver are the medallion layers: raw files land untouched so a bad parse can be replayed, and the Parquet layer is what everything downstream reads. The whole thing runs under Docker Compose.