Dashboards — React
Built Sentinel-IoT: a live React + Recharts monitoring dashboard polling a REST API every 2s, with alert feeds and trend charts. Vue 3 too — a full messenger front-end.
CS & AI student at Sapienza University of Rome (GPA 29.2/30). Drag a project above or scroll to explore.
Everything below is shipped, public code — each requirement in your stack maps to something I've already built and can walk you through.
Built Sentinel-IoT: a live React + Recharts monitoring dashboard polling a REST API every 2s, with alert feeds and trend charts. Vue 3 too — a full messenger front-end.
Science Duel, a Next.js/TypeScript classroom tool with auth-gated flows, timers, leaderboards — used weekly in real classes. Plus Python automations that generate, sign and track PDF reports.
Express REST APIs with middleware, CORS and logging; a FastAPI inference service; a Go backend designed OpenAPI-first (897-line spec). I integrate third-party APIs (OpenAI, Lichess) daily.
PostgreSQL + pgvector powering a RAG assistant; MongoDB/Mongoose persistence for a CRUD app; SQLite analytics over ~10⁸ rows; MS SQL Server in a production internship.
OpenAI embeddings + retrieval pipelines, PyTorch models served behind REST APIs, and an AI schedule assistant in my iOS app. Stanford ML Specialization; 30 e lode in Deep Learning.
All projects versioned on GitHub with clean commit history; continuous deployment to Vercel for the Next.js tools; Docker Compose for multi-service apps; AWS EC2 for data pipelines.
A real-time predictive-maintenance platform: streaming sensor data in, a PyTorch LSTM predicting Remaining Useful Life, and a live React dashboard turning predictions into operational alerts.


POST /api/sensor-dataGET /api/engines · /api/alertspoll every 2s// Fire all three GETs in parallel — concurrent, not sequential. const fetchData = useCallback(async () => { const [enginesRes, alertsRes, healthRes] = await Promise.all([ fetch(`${API_URL}/api/engines`), fetch(`${API_URL}/api/alerts`), fetch(`${API_URL}/api/health`), ]); /* ... */ }, []); useEffect(() => { fetchData(); const interval = setInterval(fetchData, POLL_INTERVAL); return () => clearInterval(interval); // no leaks }, [fetchData]);
# The API is PASSIVE — it receives; it never fetches. # Simulator, real sensor or unit test all talk to it identically. class SensorReading(BaseModel): engine_id: int cycle: int sensor_values: list[float] # The API owns the buffer AND the alert thresholds — # "what counts as critical" is a business rule, not a UI concern. WINDOW_SIZE = 30 THRESHOLD_WARNING = 50 THRESHOLD_CRITICAL = 20
/docs for freeA WhatsApp-style messaging app built end-to-end for Sapienza's Web & Software Architecture course — the exam I closed with 30 e lode. Designed OpenAPI-first, shipped in Docker.

// The chat list isn't a list — it's a draggable ring of orbs // driven by a hand-rolled spring integrator + rAF loop. function springStep(pos, vel, target, k, d, dt) { const f = k * (target - pos) - d * vel return [pos + (vel + f * dt) * dt, vel + f * dt] } function animate() { if (!dragActive && Math.abs(rotVel) > 0.00008) { rotVel *= 0.962 // inertial flick decay rotVal += rotVel clampRot() } /* spring the ring between full ⇄ compact layouts */ rafId = requestAnimationFrame(animate) }
A shared task manager for iOS I designed and built end-to-end: post a task to a group, someone calls dibs, everyone sees the plan. It's my proof that I care about UI/UX craft — hierarchy, motion, and interfaces that explain themselves.




Every screen has one job: "Today" leads with the only number that matters — ≈ 2h 15m of work — before any list. Overdue state is color + copy + position, never color alone.
A full custom color system (grid, spectrum, sliders + eyedropper), tab bars that stay out of the content's way, and motion used to explain state changes — not to show off.
A cloud data pipeline + analytics project: do trap openings spread like viral misinformation? Built on AWS EC2, streaming ~10⁸ Lichess games into SQLite, analysed with pandas & scikit-learn.
About 100 million rated Lichess games were processed across 30 observed months using one streaming pass per file. The monthly all-opening volume chart rises from 15.8 million games in January 2019 to 35.3 million at the July 2020 pandemic and Queen's Gambit shock. A second chart shows exact PCA loadings for trickiness, soundness, punish gap, and surprise; PC1 explains 38.4 percent and PC2 explains 27.1 percent of variance.
The finding starts with the shock: pandemic play and The Queen's Gambit nearly doubled monthly blitz volume. PCA then compresses trickiness, soundness, punish gap and surprise into interpretable “meme” axes; opening-specific effects were still validated against placebo distributions, not just p-values. Data engineering, SQL and honest statistics in one repo.
RAG assistant over my university materials: OpenAI embeddings pipeline with a PostgreSQL + pgvector retrieval store behind a FastAPI backend. Ask a question, get an answer grounded in the actual notes.
FastAPI · PostgreSQL · pgvector · OpenAI APINext.js + TypeScript internal web tool with password-gated flows, attendance, timed duels, score tracking and leaderboards. Deployed on a Vercel-style CD workflow and used weekly in my real classes.
Next.js · React · TypeScript · Vercel View repo ↗Express REST API with MongoDB/Mongoose persistence, CORS, JSON middleware and request logging, consumed by a React/Vite client with Axios. The bread-and-butter stack of client work, done cleanly.
Node.js · Express · MongoDB · React View repo ↗Internal Python tools that generate, fill, digitally sign and track lesson-report PDFs for my teaching job — replacing a fully manual paperwork workflow for good.
Python · ReportLab · automationUniversity of Helsinki's deep-dive into modern web development — React, Redux, Node.js, Express, MongoDB, GraphQL and TypeScript, exercise by exercise.
React · Node · GraphQL · TS View repo ↗Software engineering intern at TazarvAfzar Co. — REST API integrations and relational schema design in MS SQL Server, inside a real production environment.
REST · MS SQL Server · productionMy ML work ends up behind APIs and inside products — and it's backed by coursework I took seriously.
For Sentinel-IoT I trained and compared LSTM, 1D-CNN and Transformer models on NASA C-MAPSS turbofan data (RMSE + NASA's asymmetric score), then served the winner through FastAPI into the React dashboard.
Production-style RAG: chunking, OpenAI embeddings, pgvector similarity search, and prompt assembly — the exact pattern behind most practical AI tools companies build today.
Stanford Machine Learning Specialization (Coursera). 30 e lode in Deep Learning and in AI Lab: Computer Vision & NLP at Sapienza. 3rd place, Sharif University CS Summer School national competition.
BSc — Applied Computer Science & Artificial Intelligence
| Course | Year | Result |
|---|---|---|
| Web & Software Architecture | 2026 | 30 e lode |
| Programming I | 2024 | 30 e lode |
| Programming II | 2024 | 30 e lode |
| Deep Learning | 2026 | 30 e lode |
| AI Lab: Computer Vision & NLP | 2025 | 30 e lode |
| Human–Computer Interaction | 2026 | 30 / 30 |
| Probability | 2025 | 30 / 30 |
"30 e lode" = 30 with distinction, the highest possible grade in the Italian system. Full transcript available on request.
I'm early in my career and honest about it — what I offer is speed of learning, ownership, and code you'll enjoy inheriting.
Vue for one project, Go for another, SwiftUI, PyTorch, EC2 — none of these were handed to me in a lecture. If your stack shifts to a new framework or an AI tool next quarter, I'll meet it there. Adapting to your needs is the skill I've practiced most.
I've balanced a full-time degree with a real teaching job since 2023 — deadlines, classrooms, paperwork. When I say something will be done, it gets done, without needing a push.
Open any file in my repos — design decisions are written down where the next developer will find them. OpenAPI specs before implementation, commit histories that read like a changelog.
Teaching made me good at explaining technical things simply — to colleagues, clients or students. I take feedback without ego and give it with care. Persian, English, and enough Italian to laugh at the right moments.