Shayan Koohi
Shayan Koohi
CS & AI · Sapienza
Live Available for work — Rome Drag · use ← → keys

I build dashboards, internal tools & the APIs behind them.

CS & AI student at Sapienza University of Rome (GPA 29.2/30). Drag a project above or scroll to explore.

01 — Built for this role

You need dashboards, internal tools, APIs & AI. That's exactly what I build.

Everything below is shipped, public code — each requirement in your stack maps to something I've already built and can walk you through.

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.

Internal tools — Next.js + TS

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.

APIs — Node/Express & more

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 & MongoDB

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.

AI in products

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.

Git, GitHub & Vercel

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.

02 — Featured work · Real-time ML

Sentinel-IoT

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.

Source ↗
Fig. 01Live demo — fleet cards sorted by urgency, RUL trend charts, alert feed polling every 2s
React 18RechartsVite + Tailwind FastAPIPyTorch · LSTM Docker ComposeREST + OpenAPI docs
Sentinel-IoT dashboard — engine in warning state with RUL trend chart
Fig. 02Warning state — RUL below 50 cycles, trend flagging degradation
Sentinel-IoT dashboard — critical alert with immediate action required
Fig. 03Critical alert — immediate action required, surfaced to the top
  1. Simulatorstreams NASA C-MAPSS sensor cycles, one reading at a timePOST /api/sensor-data
  2. FastAPI backendbuffers a 30-cycle sliding window per engine, runs LSTM inference, owns alert logicGET /api/engines · /api/alerts
  3. React dashboardfleet cards sorted by urgency, RUL trend charts, live alert feedpoll every 2s
dashboard/src/Dashboard.jsxReact
// 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]);
Listing 01Pull-based by design — simpler than a websocket, proxy-friendly, 2s latency is right for human monitoring
src/api.pyFastAPI
# 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
Listing 02Typed contracts via Pydantic — validation + auto-generated Swagger docs at /docs for free
03 — Featured work · Full-stack messaging

WASAText — a full messenger, Vue 3 front to Go back.

A 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.

ishayankoo001/Messenger ↗
Fig. 05Live demo — groups, replies, reactions, forwarding, photo upload, read receipts
Vue 3Go REST backend OpenAPI-first · 897-line specSQLite Docker · nginxAxios
WASAText — custom ring-based chat browser UI, dark theme
Fig. 04The chat browser — a draggable ring of contact orbs instead of the usual list
webui/src/components/ContactRing.vueVue 3
// 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)
}
Listing 03Every feature spec'd in OpenAPI before a line of Go was written
56.6%Vue — component-driven SPA front-end
35.8%Go — REST API + SQLite persistence
897lines of OpenAPI spec — designed before implementation
30 e lodeWeb & Software Architecture — the course this was graded in
04 — Featured work · iOS, design

Dibs — design is not decoration.

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.

Fig. 06Live walkthrough — 2-minute screen recording
iOS · SwiftNative dark-first design system AI schedule assistantWorkload estimates
Dibs — home screen
HomeFig. 07today's workload at a glance
Dibs — Ask Today: AI assistant summarising the week's workload
Ask TodayFig. 08AI answers about your schedule
Dibs — calendar with deadline density per day
CalendarFig. 09deadline density at a glance
Dibs — task detail with Claim this task action
Claim itFig. 10one clear primary action
i.

Hierarchy before decoration

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.

ii.

Details that earn trust

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.

05 — Featured work · Data engineering

Chess openings, treated like memes.

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.

AWS EC2Python streaming ETL SQLite + SQL viewspandas · scikit-learn statsmodels · PCA
chess-openings-as-memes ↗
Behavioral signal lab · raw volume + PCA

From chess boom to meme axis

Study complete

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.

Monthly blitz volumeKept Lichess games · all openings raw counts · millions
Monthly kept Lichess blitz game volume Thirty observed months. Volume starts at 15.8 million games in January 2019, jumps to 35.3 million in July 2020, and reaches the mid-forties through 2021. 35.3m · JUL 2020Pandemic + Queen's Gambit:volume nearly doubles
Feature loadingsPCA · four z-scored features
PCA feature loadings PC1 loadings are 0.508 for trickiness, 0.726 for soundness, negative 0.463 for punish gap, and negative 0.010 for surprise. PC2 loadings are negative 0.621, 0.029, negative 0.646, and 0.442 respectively.
  • ~108rated games parsedLichess monthly dumps
  • 30months analysedresumable EC2 ingestion
  • 1streaming passper file · headers only
  • 20 + 20placebo testsrandom months · control openings
  1. EC2 ingest.pgn.zst dumps
  2. Single passfilter + aggregate
  3. SQLiteviews + rating bins
  4. Analysisregression + PCA

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.

06 — More builds

Smaller tools, same care.

01.

Course-Notes AI Assistant

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 API
02.

Science Duel — classroom tool

Next.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 ↗
03.

Phonebook — CRUD, end to end

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 ↗
04.

Teaching-ops automation

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 · automation
05.

Full Stack Open

University 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 ↗
06.

Production experience

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 · production
07 — Machine learning

ML that ships, not just notebooks.

My ML work ends up behind APIs and inside products — and it's backed by coursework I took seriously.

01.

Three architectures, one benchmark

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.

02.

Retrieval & embeddings

Production-style RAG: chunking, OpenAI embeddings, pgvector similarity search, and prompt assembly — the exact pattern behind most practical AI tools companies build today.

03.

Credentials

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.

08 — Education

The grades behind the projects.

Sapienza University of Rome

BSc — Applied Computer Science & Artificial Intelligence

29.2/30
GPA · 2023 — present
ENEnglish — fluent, IELTS 8.0
FAPersian — native
ITBased in Rome since 2023
CourseYearResult
Web & Software Architecture202630 e lode
Programming I202430 e lode
Programming II202430 e lode
Deep Learning202630 e lode
AI Lab: Computer Vision & NLP202530 e lode
Human–Computer Interaction202630 / 30
Probability202530 / 30

"30 e lode" = 30 with distinction, the highest possible grade in the Italian system. Full transcript available on request.

09 — How I work

Hire the trajectory, not just the snapshot.

I'm early in my career and honest about it — what I offer is speed of learning, ownership, and code you'll enjoy inheriting.

i.

I learn whatever the product needs

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.

ii.

Responsible & independent

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.

iii.

Clean code, explained code

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.

iv.

Reliable in a team

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.