1. 2026
    University, Completed

    Study Abroad Manager

    A full-stack web app designed to manage Ca' Foscari study abroad programs. It tracks the entire process connecting students, academic coordinators, and the International Office. Open projectClose
    Student view: "Le mie applications" page with three applications, each showing its status (upload the Learning Agreement, waiting for the lecturer, no action needed), phase, host university and referent lecturer, plus the "Nuova application" button
    Period
    Apr 2026 – Jun 2026
    Role
    Solo
    Status
    Completed

    The demo runs in the browser with sample data that resets on reload. Interface in Italian.

    Problem

    Ca' Foscari's Overseas programme sends students to partner universities outside Europe, and each stay needs a learning agreement, approvals, plan changes and exam recognition shared by student, lecturer and office, all of it currently handled through email threads. My Web Applications and Technologies exam asked for an app to manage it.

    Solution

    A web app with one view per role, driven by an 11-state workflow. Students create applications and upload PDFs with their exam plan and grades, and lecturers approve or reject them with a reason. The office checks the pre-departure phase and closes the file.

    Challenges

    • Every state change is checked against a table of allowed transitions, inside a transaction that locks the row.
    • Each learning agreement version keeps its own exam plan, so rejecting a change reactivates the previous one.
    • Socket.IO only says which application changed, and the client reloads it over HTTP, so the REST API stays the single source of truth.

    What I learned

    • Documenting a project properly: ER diagram, state machine, API reference and walkthroughs.
    • Containerising three services with Docker Compose, with separate development and production setups.
    • Angular with standalone components and signals, and TypeScript on both ends.

    Stack

    • Angular 18
    • TypeScript
    • Node.js
    • Express
    • PostgreSQL
    • Socket.IO
    • JWT
    • Zod
    • Multer
    • Docker
    • Nginx

    Press & recognition

    • Graded 30 cum laude out of 30 in the Web Applications and Technologies exam.

    Screenshots

    Student's application detail for Columbia University: "Carica il Learning Agreement" action box, empty exam mapping and the progress timeline with the steps still to come Lecturer view of an application waiting for review: Learning Agreement PDF to download, "Approva / Rifiuta" button, exam mapping and the progress timeline Lecturer view: "Applications da seguire" page filtered on "Da gestire", with two applications waiting for the Learning Agreement evaluation
  2. 2025
    Freelance, In progress

    Sales Agents Association CRM

    A membership CRM for Agenti Treviso, an association of sales agents: member records, contact history and membership fees. Open projectClose
    Member page with last contact, payment status, personal details and the event timeline
    Period
    Mar 2025 – present
    Role
    Solo
    Status
    In progress

    This is a private client project, so the code is not public. The first version is finished and delivered, and I'm working on a second one.

    Problem

    Agenti Treviso, an association of sales agents, was running on an old management program that had become obsolete. Replacing it was my first paid project for a real client.

    Solution

    A web CRM where staff keep each member's record and a timeline of contacts, consultations and payments. Edits appear live in every open session, so the data stays in sync and organized in one place, in a simple interface that keeps everything in view. I'm working on smarter features, with the help of AI, so the association never loses touch with any of its members.

    Challenges

    • Working for a paying client: for the first time I had to meet firm deadlines and put a value on my work in time and money.
    • Sync between staff sessions: every write is broadcast over Socket.IO and each client patches its open views without reloading, while handling the race conditions of two people editing the same record at once.
    • Traceability: nothing is overwritten silently. Every change to a member or event is logged, so it's always possible to see what a record looked like before.

    What I learned

    • Designing everything before writing code, first with the client and then on the technical side, cuts development time considerably.
    • Relying on Firebase and Algolia ties an app meant to run for years to services that can deprecate features or break compatibility. The second version I'm working on removes them and runs in Docker.
    • A codebase this size needs types: I'm writing the second version in TypeScript.

    Stack

    • Node.js
    • Express
    • Socket.IO
    • Firebase (Firestore, Auth, Storage)
    • Algolia
    • ExcelJS
    • JavaScript
    • HTML
    • CSS

    Screenshots

    Member list sorted by last contact, with a payment status badge on each row Event list dialog showing the details of a phone contact next to the member's timeline
  3. 2024
    Personal, Completed

    Cinema Usher Schedule Generator

    A web app that turns The Space Cinema's daily screening schedule into a printable work sheet, with the time ushers must enter each screen. Open projectClose
    Home screen of the app: The Space Cinema logo, the title "Scheda Lavoro", an orange button to create a new work sheet and a "Consulta orari salvati" link to the saved times
    Period
    Jun 2024 – Jul 2024
    Role
    Solo
    Status
    Completed

    No public demo. You can run it locally with the sample cinema schedule included in the repository.

    Problem

    At The Space Cinema in Treviso, where I worked as an usher, audiences leave through exits under the screen. Ushers must enter before the credits, but the cinema's system only lists when screenings end, so staff worked out every entry time by hand.

    Solution

    A web app that turns the cinema's daily schedule into a printable work sheet. The sheet shows when to enter each screen and when each screen closes. Each film's credits length is entered once and saved, so later sheets need no manual input.

    Challenges

    • Choosing what to save: the schedule's start time includes the ads, which change every week, so I save the credits length, which never changes.
    • Reading the exported spreadsheet in the browser, where times come as text or as dates and screenings end after midnight.

    What I learned

    • Talking to a client for the first time and finding what they need.
    • Working with what I had: a few sample exports and what I knew from my shifts.
    • Designing a technical tool that anyone on staff can use.

    Stack

    • Node.js
    • Express
    • Firebase Firestore
    • SheetJS
    • HTML
    • CSS
    • JavaScript

    Screenshots

    Step one: progress bar with the three steps "Carica l'XLS", "Inserisci orari luci", "Scarica la scheda" and an orange button to upload the XLS file Step two: window listing the films with no saved credits, here "(V.O.) KINDS OF KINDNESS", with hours and minutes fields under "Accensione luci dopo" and the Indietro and Fatto buttons Step three: the message "La scheda è pronta!" with an orange button to download or print the work sheet Saved times window: list of films such as "IF - GLI AMICI IMMAGINARI - 9 min" and "LA STANZA DEGLI OMICIDI - 15 min", each with a trash icon, and an orange Fatto button Printed work sheet for 10 June 2024: three columns of rows with screen number, entry time and an empty name field, cleaning tasks under each column, and on the right the closures box with each screen's closing time and an empty breaks box
  4. School, Completed

    ImpressionCafé - VR & Conversational AI

    A VR reconstruction of the Café Guerbois where students can talk to four Impressionist painters, each played by an AI chatbot. 2 press mentions Open projectClose
    A frame from the demo video: Edgar Degas seen through the headset, with an inset of a student wearing it and the live chat page showing the transcribed question and the answer
    Period
    Oct 2023 – May 2024
    Role
    Team of 2, backend
    Status
    Completed

    The demo is a video. The live version needs a VR headset and paid AI services.

    Problem

    My art history teacher asked for an interactive reconstruction of the Café Guerbois where students could talk with the Impressionist painters instead of only reading about them. I teamed up with Ivan Lomaka and, drawing on our Cappella degli Scrovegni 360° project, we brought together AI chatbots, VR headsets and art history to build it.

    Solution

    A VR café with Monet, Renoir, Degas and Manet: you walk up to one, ask a question out loud and he answers by voice, in character. A web page follows every conversation live and, without a headset, works as a simple chat with the painters. I built the server and the web pages, Ivan built the VR client, Andrea Luca Bristot modelled the café.

    Challenges

    • Waiting for the whole reply before turning it into speech was too slow, so I stream it and send each sentence to text-to-speech while the model is still writing.
    • The audio clips can come back in the wrong order, so each one is numbered and they are always played in sequence.
    • Each session has one socket channel that feeds both the headset and any browser watching.

    What I learned

    • Working in a team with a sharp split: the server was mine, Unity was Ivan's.
    • Building a system whose parts live in separate environments, talk over an API and WebSockets and serve different kinds of clients at once.
    • Working with the OpenAI APIs (chat models and Whisper) and Google Cloud Text-to-Speech.
    • Treating response time as a requirement, not only whether the system works.

    Stack

    • Node.js
    • Express
    • Socket.IO
    • OpenAI API (Whisper, GPT-3.5)
    • Google Cloud Text-to-Speech
    • Firebase (Firestore, Storage)
    • Unity
    • C#

    Press & recognition

    Screenshots

    The Unity editor with the café scene: the painters and the other customers around the tables, and below it the first-person view from the headset
  5. 2023
    Personal, Completed

    Spotify Stats with Friends

    A web app where my friends and I log in with Spotify to see our top genres, tracks and artists. Open projectClose
    Spotify Stats home page with the top genres of all time as pills and the top tracks as album covers
    Period
    Apr 2023 – May 2023
    Role
    Solo
    Status
    Completed

    Static demo with a snapshot of my Spotify data from October 2026: opening the app to everyone needs Spotify's approval, whose strict requirements went beyond the scope of this project, so the real app stays in development mode

    Problem

    Music is one of my passions, and I wanted a way to see stats and information about my Spotify account. So I built my own app, with a social side, and took the chance to learn how a third-party API with OAuth works.

    Solution

    A Node.js web app where you log in with Spotify and see your top genres, tracks and artists over three time ranges, plus your recent streams. You can add friends by Spotify ID and open their stats. An admin console shows who is online and the server errors.

    Challenges

    • Keeping sessions alive: the server swaps the refresh token for a new access token when the old one expires.
    • Friends' stats: Spotify shows top items only to their owner, so the server stores each user's refresh token.
    • Live updates: Firestore listeners push notifications, friends and errors to the browser through Socket.IO.

    What I learned

    • How the OAuth 2.0 authorization code flow and refresh tokens work.
    • How to manage sockets for live updates with Socket.IO.
    • How to build an admin console with a live log of server errors.

    Stack

    • Node.js
    • Express
    • Socket.IO
    • Cloud Firestore
    • Spotify Web API
    • JavaScript
    • HTML
    • CSS

    Screenshots

    Top artists of all time as round pictures with their popularity, and the recent streams list grouped by day Admin console with one person online, eleven registered accounts, the list of online accounts and the error log
  6. 2022
    School, Completed

    Scrovegni Chapel 360° Virtual Tour

    A bilingual 3D tour of the Scrovegni Chapel in Padua: anyone can explore the interior from the browser and open a description and an audio guide for each of 58 frescoes. Award3 press mentions Open projectClose
    The 3D model of the chapel's exterior floating in a starry space, next to the title "Scrovegni Chapel"
    Period
    Sep 2021 – Mar 2022
    Role
    Team of 2, lead developer
    Status
    Completed

    The demo is served as a static page, so the rating and problem forms don't work there.

    Problem

    My art history teacher wanted a website that rebuilds the Scrovegni Chapel in 3D, with descriptions and audio guides of the frescoes made by the class. I built the site with my classmate @IvanLomaka, and together we designed and coded all of it, from the 3D scenes to the interface and the server.

    Solution

    A three.js site that opens on a 3D model of the exterior and then moves into a 360° view of the interior, with 58 clickable points. Each point opens a description and an audio guide, in Italian or English, written and recorded by the class.

    Challenges

    • I drove the home camera with the scroll wheel, moving it between fixed viewpoints with an ease-in-out curve.
    • I turned a cubemap into a 360° interior and made 58 points in 3D space clickable.
    • I handed control from the WebGL canvas to an HTML panel and back.

    What I learned

    • The basics of three.js: scenes, cameras, renderers, models, cubemaps.
    • How to mix a 3D canvas with ordinary HTML interfaces.
    • My first server: Express, validation and a database behind a page.

    Stack

    • JavaScript
    • HTML
    • CSS
    • three.js
    • Tween.js
    • Node.js
    • Express
    • Joi
    • Firebase (Firestore, Analytics)
    • Heroku
    • Netlify

    Press & recognition

    Screenshots

    The 360° view of the interior with white dots on the frescoes The panel for the Last Judgment, with the fresco and its English description
  7. 2021
    Personal, Completed

    Chess with Minimax AI

    A chess game for the browser, written from scratch in plain JavaScript, with a minimax AI to play against. Open projectClose
    Game in progress: wooden chessboard with the pieces, the captured-pieces counter and last move on the right, and the player and AI panels on the left
    Period
    Mar 2021 – May 2021
    Role
    Solo
    Status
    Completed

    Problem

    I've always loved computers, and high school turned that into programming. During the second Covid lockdown in Italy I had plenty of free time, and I wanted to rebuild chess and then get the computer to play against me.

    Solution

    A web page where you can play against another person, against the AI at four difficulty levels, or watch two AIs play each other. Each level makes the minimax search one move deeper. Click a piece to see where it can move. Side panels show captured pieces, the last move and how many positions the AI evaluated.

    Challenges

    • Legal moves: I try each move on a copy of the board and discard it if it leaves the king in check.
    • Checkmate or stalemate: with no legal moves left, the game is lost if the king is attacked and drawn if not.
    • The AI: minimax with alpha-beta pruning, following a freeCodeCamp guide, adapted to my own board representation.

    What I learned

    • Modelling game state with 8×8 matrices.
    • Driving a page through the DOM without a framework.
    • How quickly global variables and repeated code become hard to change.

    Stack

    • HTML
    • CSS
    • JavaScript (no libraries)
    • Google Fonts

    Screenshots

    Home screen with the three game modes (person vs person, person vs bot, bot vs bot) and the Replay and Settings buttons

Education

Experience

  • Jan 2024

    Software Engineering Shadowing

    Targa Telematics, Treviso

    A highly formative experience that taught me the importance of critical thinking and improved how I analyze and solve complex problems.

Other experience

Jobs outside programming that taught me to work with customers and in a team.

  • Jun 2025 – Apr 2026

    Sales associate

    MediaWorld, Treviso

    Selling smartphones and related services, where I learned to turn technical specs into clear advice and to find out what each customer really needed.

  • Mar 2024 – Jan 2025

    Multiplex operator

    The Space Cinema, Treviso

    Balancing shifts at the cinema with full-time studies taught me to manage my time with discipline and to stay reliable under pressure.

Press & recognition

Articles, competitions and events where my projects appeared.

Curious about my work?
Let's get in touch!

Whether it's a project, an internship, or just a chat about something you saw here, I'd be glad to hear from you.