ML/AI engineer portfolio website, built by Claude Haiku 5.5
Hostedvia Claude CodeOpenRouter
Show the code the model wroteHide the code
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Mira Kovač — Senior Machine Learning Engineer</title>
<meta name="description" content="CV of Mira Kovač, Senior Machine Learning Engineer based in Berlin.">
<style>
:root {
--bg: #0b0f0c;
--fg: #cdd7cf;
--muted: #7b8a80;
--rule: #1b251e;
--edge: #2e3d33;
--green: #3ddc84;
--font: ui-monospace, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
--s1: 8px;
--s2: 16px;
--s3: 24px;
--s4: 32px;
--s5: 48px;
--s6: 64px;
}
* { box-sizing: border-box; }
html { background: var(--bg); }
body {
margin: 0;
background: var(--bg);
color: var(--fg);
font: 15px/1.65 var(--font);
-webkit-text-size-adjust: 100%;
}
::selection { background: var(--green); color: var(--bg); }
a { color: inherit; }
a:focus-visible { outline: 1px solid var(--green); outline-offset: 3px; }
.wrap {
max-width: 720px;
margin: 0 auto;
padding: 0 var(--s2);
}
/* Header */
header { padding: var(--s6) 0 var(--s5); }
.prompt {
margin: 0;
color: var(--muted);
overflow-wrap: anywhere;
}
.prompt b { color: var(--green); font-weight: 400; }
.prompt.end { margin-top: var(--s5); }
.caret {
display: inline-block;
width: 0.6em;
height: 1em;
margin-left: 2px;
vertical-align: -0.15em;
background: var(--green);
animation: blink 1.1s steps(1) infinite;
}
@keyframes blink { 50% { opacity: 0; } }
@media (prefers-reduced-motion: reduce) { .caret { animation: none; } }
h1 {
margin: var(--s4) 0 0;
font-size: clamp(1.75rem, 6vw, 2.5rem);
line-height: 1.15;
font-weight: 700;
letter-spacing: -0.02em;
}
.role {
margin: var(--s1) 0 0;
color: var(--green);
}
.summary {
margin: var(--s3) 0 0;
max-width: 58ch;
}
.menu {
display: flex;
flex-wrap: wrap;
gap: var(--s1) var(--s3);
margin: var(--s4) 0 0;
padding: 0;
list-style: none;
font-size: 0.875rem;
}
.menu a { color: var(--muted); text-decoration: none; }
.menu a:hover { color: var(--green); }
/* Sections */
section {
padding: var(--s6) 0;
border-top: 1px solid var(--rule);
}
h2 {
margin: 0 0 var(--s4);
font-size: 0.875rem;
font-weight: 400;
color: var(--muted);
}
h2 .sym { color: var(--green); margin-right: var(--s1); }
/* Experience timeline */
.timeline {
list-style: none;
margin: 0;
padding: 0;
}
.timeline > li {
display: grid;
grid-template-columns: 112px 1fr;
gap: 0 var(--s3);
}
.timeline > li + li { margin-top: var(--s5); }
.year {
color: var(--green);
white-space: nowrap;
}
.entry {
position: relative;
padding-left: var(--s3);
border-left: 1px solid var(--edge);
}
.entry::before {
content: "";
position: absolute;
left: -4px;
top: 9px;
width: 7px;
height: 7px;
background: var(--green);
}
.entry h3 {
margin: 0;
font-size: 1rem;
font-weight: 700;
line-height: 1.5;
}
.org {
display: block;
margin-top: 2px;
font-weight: 400;
color: var(--muted);
}
.bullets {
list-style: none;
margin: var(--s2) 0 0;
padding: 0;
}
.bullets li {
position: relative;
padding-left: var(--s3);
}
.bullets li::before {
content: ">";
position: absolute;
left: 0;
color: var(--muted);
}
.bullets li + li { margin-top: var(--s2); }
/* Skills */
.chips {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-wrap: wrap;
gap: var(--s1);
}
.chips li {
padding: 4px 12px;
border: 1px solid var(--edge);
line-height: 1.5;
}
/* Projects and publication */
.rows {
list-style: none;
margin: 0;
padding: 0;
}
.rows li {
display: grid;
grid-template-columns: 180px 1fr;
gap: 0 var(--s3);
padding: var(--s2) 0;
border-top: 1px solid var(--rule);
}
.rows li:last-child { border-bottom: 1px solid var(--rule); }
.rows .name { color: var(--green); }
.pub {
margin: 0;
padding: var(--s2) 0;
border-top: 1px solid var(--rule);
border-bottom: 1px solid var(--rule);
}
.pub em { font-style: normal; color: var(--green); }
/* Contact row */
.contact {
display: flex;
flex-wrap: wrap;
gap: var(--s1) var(--s4);
margin: 0;
padding: 0;
list-style: none;
}
.contact a { text-decoration: none; border-bottom: 1px solid var(--edge); }
.contact a:hover { color: var(--green); border-color: var(--green); }
.contact .label { color: var(--muted); }
footer {
padding: var(--s5) 0;
border-top: 1px solid var(--rule);
font-size: 0.8125rem;
color: var(--muted);
}
/* Phone width */
@media (max-width: 560px) {
header { padding: var(--s5) 0 var(--s4); }
.timeline > li { grid-template-columns: 1fr; gap: var(--s1) 0; }
.year { padding-left: var(--s3); }
.rows li { grid-template-columns: 1fr; gap: var(--s1) 0; }
}
</style>
</head>
<body>
<div class="wrap">
<header>
<p class="prompt"><b>mira@berlin</b>:~$ cat cv.md</p>
<h1>Mira Kovač</h1>
<p class="role">Senior Machine Learning Engineer · Berlin</p>
<p class="summary">Nine years building models that have to survive contact with operations: demand forecasting, document NLP for logistics, and the MLOps that keeps them honest after launch.</p>
<ul class="menu">
<li><a href="#experience">experience</a></li>
<li><a href="#skills">skills</a></li>
<li><a href="#projects">projects</a></li>
<li><a href="#publications">publications</a></li>
<li><a href="#contact">contact</a></li>
</ul>
<p class="prompt end"><b>mira@berlin</b>:~$ <span class="caret" aria-hidden="true"></span></p>
</header>
<section id="experience">
<h2><span class="sym">$</span>ls experience/</h2>
<ol class="timeline">
<li>
<div class="year">2022 — now</div>
<div class="entry">
<h3>Senior Machine Learning Engineer<span class="org">Ostkante Mobility, Berlin</span></h3>
<ul class="bullets">
<li>Own the demand-forecasting stack behind fleet rebalancing across 14 cities. Replaced 40 per-station LightGBM models with one hierarchical model using learned station embeddings; weekly MAPE fell from 18.4% to 11.2% on held-out stations.</li>
<li>Found a label-leakage bug in the backtest, where future bookings were leaking into lag features. Fixing it lowered the reported accuracy by about three points, and every model now reads features from a point-in-time-correct store.</li>
<li>Lead a team of three. Built drift monitoring on input PSI and output calibration; alerts fire when a city's error runs above its 14-day baseline, which caught two upstream sensor outages this year.</li>
</ul>
</div>
</li>
<li>
<div class="year">2019 — 2022</div>
<div class="entry">
<h3>Machine Learning Engineer<span class="org">Kiefernhof Logistik, Berlin</span></h3>
<ul class="bullets">
<li>Shipped a transformer-based address-normalisation model for the parcel-sorting pipeline. Manual re-routing dropped from 6.1% to 1.7% of parcels after rollout to four hubs.</li>
<li>Quantised the model to INT8 with ONNX Runtime. p95 CPU latency went from 47 ms to 9 ms, so the hub edge boxes run it without a GPU.</li>
<li>Set up active learning on low-confidence splits with the operations team. The labelled set doubled in one quarter without adding annotation headcount.</li>
</ul>
</div>
</li>
<li>
<div class="year">2017 — 2019</div>
<div class="entry">
<h3>Data Scientist<span class="org">Halden Energy Analytics, Berlin</span></h3>
<ul class="bullets">
<li>Built load-forecasting models for two regional grid operators, using gradient-boosted trees over STL-decomposed demand. Beat the incumbent ARIMA baseline at 9 of 12 substations in the year-end review.</li>
<li>Wrote the smart-meter ingestion checks (gap detection, DST and timezone handling) that became the team's reference pipeline.</li>
<li>Automated weekly retraining on Airflow with experiments tracked in MLflow, turning a two-day manual refresh into an overnight job.</li>
</ul>
</div>
</li>
</ol>
</section>
<section id="skills">
<h2><span class="sym">$</span>cat skills</h2>
<ul class="chips">
<li>Python</li>
<li>PyTorch</li>
<li>LightGBM</li>
<li>Forecasting</li>
<li>MLflow</li>
<li>Kubeflow</li>
<li>ONNX Runtime</li>
<li>SQL</li>
</ul>
</section>
<section id="projects">
<h2><span class="sym">$</span>ls projects/</h2>
<ul class="rows">
<li>
<span class="name">./wordle-solver</span>
<span>Entropy-maximising Wordle guesser that averages 3.6 guesses across the full answer list.</span>
</li>
<li>
<span class="name">./onnx-bench</span>
<span>Latency harness comparing ONNX Runtime, OpenVINO and TFLite on small vision models across CPU classes.</span>
</li>
<li>
<span class="name">./ubahn-tiles</span>
<span>Vector-tile map of Berlin's U-Bahn network, rendered straight from GTFS in under 400 lines of Python.</span>
</li>
</ul>
</section>
<section id="publications">
<h2><span class="sym">$</span>cat publications</h2>
<p class="pub">
Kovač, M. (2021). “Hierarchical station embeddings for sparse demand forecasting.”
<em>Proceedings of the Nordic Workshop on Applied Time Series.</em>
</p>
</section>
<section id="contact">
<h2><span class="sym">$</span>echo contact</h2>
<ul class="contact">
<li><span class="label">email </span><a href="mailto:mira@example.com">mira@example.com</a></li>
<li><span class="label">github </span>mira-kovac</li>
<li><span class="label">based in </span>Berlin, DE</li>
</ul>
</section>
<footer>
Fictional sample CV. The persona, employers and projects are invented.
</footer>
</div>
</body>
</html>Same prompt, other models
One email when a new model lands on the board or in the showcase. Unsubscribe anytime.