Giuseppe Villella
UMG Catanzaro · Computer & Biomedical EngineeringNight shift · waste collectionThe rest · study and code

It's night in Calabria. I'm probably on shift.

I study engineering. At night I collect waste. In between, I build software.

I'm a Computer and Biomedical Engineering student at Magna Græcia University in Catanzaro, Italy. I also work as a waste collection operator, so I know field operations from the inside. That's the perspective I bring to my projects: software designed for the people who actually use it.

Projects

5 projects · none abandoned
ECO · waste managementComplete · 98 tests

EcoCity

A web platform that digitizes the whole shift, from the QR code on the vehicle to cost analysis.

Python 3.12Django 5PostgreSQLTailwind CSS
TKT · maintenanceComplete

Maintenance management system

Receives reports by email, assigns them to workers with the right skills, and tracks each job on a kanban board through to the work report signed by the tenant, reviewed and exported as PDF.

NestJSNext.js 16React 19Prisma
AI · assistantIn use, evolving · 959 tests

J.A.R.V.I.S.

A personal AI assistant that lives on my PC: it answers locally with a model on the GPU, goes to the cloud only for complex requests and keeps working even when the network drops. Running cost: zero.

PythonOllama · Qwen2.5 7BGroq · gpt-oss-120bChromaDB
GEO · browser gameLive

GeneralGuessr

A geography game. You guess the country from a blurred flag, then pin its capital on a map with no labels.

JavaScriptLeafletNatural Earth · world-atlasCanvas Confetti
WEB · company siteAwaiting launch

Website for an insect screen and window company

Refreshes the online presence of an insect screen and window company and presents its catalogue, from windows to fencing, with smooth browsing across product types.

HTML5Tailwind CSSJavaScript ES6+

How I work with AI

I decide what to build, I check every line that goes into the project, and I answer for it. AI agents make me faster; they don't think for me.

3 decisions made while building EcoCity →

01

The reporter isn't the culprit

At first
I had planned to record the operator who reported a truck found full as the person responsible for it.
What I noticed
That way, whoever honestly reported the problem would have taken the blame. The result would have been that nobody would have reported anything anymore.
What I decided
I separated the reporter from whoever left the truck full on the previous shift: both are visible only to supervisors, and new reports require a photo as proof.
02

The tank is never empty

At first
I calculated each vehicle's fuel consumption by comparing kilometres driven and litres refuelled on the same shift.
What I noticed
That calculation assumes an empty tank before every refuel. Anyone who drives these trucks knows that almost never happens, so the algorithm would have flagged anomalies that didn't exist.
What I decided
I moved the calculation to the window between any two refuels, with the operator declaring the tank level after each fill-up.
03

Five litres nobody saw

At first
I had set an alert to fire only when consumption deviated from the standard by more than 20%.
What I noticed
A small theft during a shift, say 5 litres out of a roughly 38-litre fill, is about 13%. A small but real shortfall would have gone unnoticed.
What I decided
I added a "Low" severity level between 10% and 20%, shown on the dashboard but with no emails, so it's visible without flooding the people who review alerts.

3 decisions made while building J.A.R.V.I.S. →

04

The key beats the voice

At first
I interrupted J.A.R.V.I.S. while it was speaking by saying the wake word, using the same model as "Hey Jarvis".
What I noticed
Without echo cancellation, the microphone picked up J.A.R.V.I.S.'s own voice and it kept interrupting itself. It wasn't a threshold to tune: it was a limit of the audio channel.
What I decided
I replaced the voice interruption with a keyboard shortcut. A physical key press can't be mistaken for an echo.
05

"Yesterday", three minutes ago

At first
I passed the model memories of past conversations without saying when they happened.
What I noticed
The model made up the date: a memory from three minutes earlier was described as "yesterday".
What I decided
I had the code compute a relative time label for each memory ("moments ago", "3 days ago") and added it to the context. The model no longer has to guess.
06

A confirmation that confirmed nothing

At first
The to-do list only recognized the phrase "add X to the list".
What I noticed
With "add X to my to-dos" the request went to the model, which replied that it had done it without adding anything. It's the most insidious kind of bug, because it doesn't look like one.
What I decided
I extended the commands to every synonym already used elsewhere in the project and stopped phrases that have a dedicated command from reaching the generic model.

Write to me. I'll answer, not J.A.R.V.I.S. In the morning, though.

For an interview, a collaboration, or just to see the projects live.

Shortcuts, for keyboard people (that's you)

g p
Projects
g m
How I work
g c
Contact
t
Switch theme
l
Switch language
?
This panel

The code is from 1986. The truck is mine.

J.A.R.V.I.S.

Hello. I'm J.A.R.V.I.S., Mr. Villella's assistant. Ask me about his projects.

Questions are not stored.