evgeniimatveev — zsh — 96×36
--:--:--

About me

evgeniimatveev@site ~ % whoami

evgeniimatveev

Analytics & MLOps Engineer
Burbank, CA
stack  Python · SQL · dbt · Docker · GitHub Actions · OR-Tools · MLflow

I build small production data & ML systems end to end — pipeline, model, dashboard, deploy, and the monitoring that tells me when it breaks. Everything below is live, not a mockup.

Live system status

evgeniimatveev@site ~ % systemctl status --all

manual snapshot, last verified 2026‑08‑18 — not a live feed, see infra.log for why

apps live
0/9
Streamlit Cloud + HF Spaces
last 24h uptime
0%
tracked via UptimeRobot
keepalive
0
Playwright /30min · curl /1hr
alerting
email·sms·call
on all 9 monitors
route-optimization-vrpstreamlit.appUP
crypto-onchain-dashboardstreamlit.appUP
tech-layoffs-trackerstreamlit.appUP
so-survey-analyticsstreamlit.appUP
weather-pipelinestreamlit.appUP
interview-coachstreamlit.appUP
job-market-pulsehf.spaceUP
olist-e-commerce-analyticshf.spaceUP
uber-driver-analyticshf.spaceUP

Projects

evgeniimatveev@site ~ % ls projects/ --sort=impact -la
route-optimization-vrp
Capacitated vehicle routing with time windows for a 45-stop LA delivery fleet, vs. a naive nearest-neighbor dispatcher.
18.7% distance saved · 100% vs 11% on-time
OR-TOOLSSTREAMLITCVRPTW
mcp-data-quality-agent
MCP server exposing data-quality checks — profiling, anomalies, freshness, significance tests — over natural language, across 5 databases.
19 tools · 33/33 tests passing
MCPPYTHONPOSTGRES
cv-logistics-mlops
Computer-vision bin-count classifier with tracked experiments and a weekly automated retraining job.
MLflow + W&B · weekly automation
PYTORCHMLFLOWMLOPS
crypto-onchain-dashboard
Daily-refreshing dashboard tracking price, dominance, and market sentiment across 8 crypto assets.
CoinGecko + Fear & Greed Index
DUCKDBSTREAMLIT
tech-layoffs-tracker
Explorer over tech-industry layoffs — by company, year, and industry — built from a public layoffs dataset.
2,412 events · 747K people · 1,713 companies
DUCKDBSTREAMLIT
so-survey-analytics
Query interface over the 2024 Stack Overflow Developer Survey — salaries, remote work, language and stack trends.
65K developers · 20 SQL queries
DUCKDBSQL
job-market-pulse
Daily-refreshed job market analytics across 10 tech stacks and 10 US cities, pulled from the Adzuna API.
100+ API calls/day · daily refresh
ADZUNA APIDUCKDB
weather-pipeline
Global weather ETL running twice a day across 20 cities on 6 continents, with retry logic and graceful per-city failure.
20 cities · 6 continents · 2×/day
OPEN-METEODUCKDB
olist-e-commerce-analytics
dbt-modeled e-commerce analytics over 100K+ Brazilian marketplace orders, with a tested transformation layer.
$13.2M revenue · 13 dbt models · 54 tests
DBTDUCKDB
uber-driver-analytics
Three years of LA rideshare trip data broken down into earnings, timing, and route patterns.
3,448 trips · $70K gross
POSTGRESQLSTREAMLIT
interview-coach
Interactive interview trainer with 35 questions across 5 practice modes, streaming responses from the Claude API.
35 questions · 5 modes
CLAUDE APISTREAMLIT
agent-memory
Self-hosted mem0/Supermemory-style long-term memory API — extracts atomic facts from text, then retrieves them ranked by relevance, importance and recency.
similarity × importance × recency re-rank
CLOUDFLARECLAUDE APIVECTORIZE
civics-sql-rag
RAG practice lab grounded in 128 official USCIS civics questions and real hands-on SQL sessions — one Vectorize index, metadata-filtered by mode.
128 civics Q&A · real SQL sessions
CLOUDFLARECLAUDE APIVECTORIZE

Incident postmortems

evgeniimatveev@site ~ % cat projects/*/POSTMORTEM.md
route-optimization-vrp
Google OR-Tools · CVRPTW
45 stopshaversine distance matrixcapacity + time-window dimensionsguided local searchroute plan
problem
A naive nearest-neighbor dispatcher missed 40 of 45 delivery windows — it drives to the closest stop with no awareness of promised time slots.
approach
Capacitated VRP with time windows via Google OR-Tools: a haversine distance matrix, a capacity dimension and a separate time dimension with per-stop windows, disjunction-with-penalty so infeasible configs still return a partial plan instead of failing outright.
incident — 2026-08-18
The app was crashing in production with an AttributeError. Traced it to one line: search_parameters.num_search_workers = 1 — a field that simply doesn't exist on the classic routing solver's RoutingSearchParameters proto in the pinned OR-Tools version (it belongs to CP-SAT's params, not this solver). Confirmed by enumerating the live proto's actual fields rather than trusting the earlier assumption, removed the line, verified the fix live within the hour.
src/cvrp_solver.py · commit a921d99 · view the real diff
@@ -149,12 +149,6 @@ def solve_cvrp(cvrp_input: CVRPInput, time_limit_s: int = 15) -> CVRPResult:
     routing_enums_pb2.LocalSearchMetaheuristic.GUIDED_LOCAL_SEARCH
 )
 search_parameters.time_limit.FromSeconds(time_limit_s)
-    # Force single-threaded search — OR-Tools otherwise auto-detects CPU count-    # and runs that many parallel search workers, each holding its own solver-    # state. Streamlit Cloud's free tier caps the container around ~1GB RAM,-    # so multi-worker search on a multi-vCPU box was the likely cause of the-    # native "Segmentation fault" crashes seen in production (2026-08-17).-    search_parameters.num_search_workers = 1

 solution = routing.SolveWithParameters(search_parameters)
18.7% distance saved 100% vs 11% on-time ~$82/day saved

Build your own route — click the stops in the order you'd drive them, then see how it stacks up against a real optimizer.

★ optimal route solved live via exact dynamic programming — not a canned answer

stops
click a stop to start your route
mcp-data-quality-agent
Model Context Protocol server
natural-language questionMCP tool routingSQL against 5 databasesprofiled result
problem
Data-quality checks — null patterns, duplicates, freshness, anomalies — were ad hoc, one-off scripts with no shared interface across databases.
approach
A 19-tool MCP server (profiling, anomaly detection, freshness checks, correlation, significance testing) that any MCP-compatible client can call directly against 5 connected databases.
19 tools 33/33 tests passing 5 databases
weather-pipeline
Open-Meteo API · DuckDB ETL
20 cities, 6 continentsOpen-Meteo APIretry + validateDuckDB (R2)Streamlit dashboard
problem
A single flaky Open-Meteo API call — a ConnectTimeout, common on a shared GitHub Actions runner — used to crash the entire twice-daily run, losing all 20 cities' data instead of just the one that failed.
approach
Per-city retry with exponential backoff, graceful skip-on-failure so one bad connection doesn't take the whole run down, plus a post-pipeline data-quality gate that fails the GitHub Actions job outright if fewer than 15 of 20 cities load cleanly — 18/20 is treated as a normal pass, not a false alarm, since transient timeouts on a shared CI runner are expected.
incident — 2026-08-20
src/extract.py imports tenacity for that retry logic, but it was never declared in requirements.txt — every scheduled and manual pipeline run had been crashing on import, silently, for days. Surfaced only while testing an unrelated storage migration (HuggingFace Dataset → Cloudflare R2), not by anyone noticing the missing data. Fixed with a one-line dependency addition, verified against a real GitHub Actions run.
requirements.txt · commit f38883a · view the real diff
 httpx>=0.27.0
+tenacity>=8.2.0
 pandas>=2.2.0
 duckdb>=0.10.0
 boto3>=1.34.0
20 cities · 6 continents 2×/day fully automated 15/20 quality-gate floor

Infrastructure and monitoring

evgeniimatveev@site ~ % cat infra.log
KEEPALIVE
Streamlit Cloud only resets its sleep timer on a real browser session — a plain HTTP ping just returns the "sleeping" splash page. Fixed with a Playwright headless-Chromium ping every 30 minutes on a GitHub Actions runner (primary), plus a Cloudflare Worker on Browser Rendering pinging the same 6 apps every 4 hours as a backup — not a replacement, since Workers' free tier caps Browser Rendering at 10 browser-minutes/day, too tight for a 30-minute cadence across 6 sites. HF Spaces don't need any of this — their free tier wakes on any plain HTTP request, so an hourly curl is enough.
MONITORING
All 9 live apps sit behind UptimeRobot with email/SMS/voice alerting. The last two were added the same day a "fix" for an intermittent crash turned it into a guaranteed one — the app was broken and live for hours before anyone noticed by hand. The response-time sparklines above are pulled from UptimeRobot's API on a schedule, not hand-typed — see scripts/generate-uptime.mjs.
CI/CD
Every repo runs its pytest suite in GitHub Actions before anything ships — routing feasibility, capacity limits, time-window compliance, and "optimized actually beats baseline" are all asserted, not eyeballed.

the two AI pipelines that actually run this page, traced end to end — not illustrated from memory, see README.md for the full mermaid version

visitor asks Worker evgeniimatveev-ask Workers AI + Vectorize 307 chunks · bge-m3 embed Claude Haiku 4.5 grounded answer daily cron GitHub Action reads recent commits Claude Haiku 4.5 ≤22-word summary changelog.json committed to repo this page

same Claude Haiku 4.5 model, two independent triggers — one answers you, one writes the log above

Skills

evgeniimatveev@site ~ % tree skills/
├──collect— Python · REST APIs · Kaggle datasets · web scraping
e.g. job-market-pulse pulls 100+ Adzuna API calls/day · weather-pipeline hits 20 cities across 6 continents twice daily · tech-layoffs-tracker's dataset comes straight from Kaggle
├──store— PostgreSQL · DuckDB · MotherDuck · Snowflake · Supabase
e.g. so-survey-analytics loads 65K dev responses into DuckDB · uber-driver-analytics runs on PostgreSQL
├──transform— dbt · pandas · SQL (window functions, CTEs)
e.g. olist-e-commerce-analytics — 13 dbt models, 54 tests, over 100K+ marketplace orders · so-survey-analytics uses window functions for percentage-of-total breakdowns across 65K responses
├──model— OR-Tools · MLflow · Weights & Biases · XGBoost / CatBoost / LightGBM
e.g. route-optimization-vrp's OR-Tools solver · cv-logistics-mlops tracked via MLflow + W&B
├──serve— Streamlit · FastAPI · Plotly · pydeck
e.g. every live app above runs on Streamlit · mcp-data-quality-agent exposes 19 tools as an MCP server
└──operate— Docker · GitHub Actions · pytest · UptimeRobot
e.g. all 9 live apps sit behind GitHub Actions CI + UptimeRobot alerting with email/SMS/voice · mcp-data-quality-agent's pytest suite gates every push, 33/33 passing

Build log

evgeniimatveev@site ~ % tail -f build.log

auto-generated daily by a GitHub Action + Claude, summarizing real commits across the repos above — not hand-written