cv/cv.html
jyrama 487210cf69 feat: add the HTML version
Added the HTML version the original PDF / ODT with some CSS hallucinated with Claude.
It's also now updated. Emdashes by Claude were removed.
2026-06-25 22:52:30 +00:00

235 lines
14 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Jyri Genral - Senior Software Engineer</title>
<meta name="description" content="Jyri Genral - senior software engineer. Distributed and embedded systems, streaming platforms (eg. Kafka), Kubernetes and cloud infrastructure. London, UK.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@500;600;700&family=IBM+Plex+Serif:ital,wght@0,400;0,600;1,400&display=swap" rel="stylesheet">
<style>
:root{
--paper:#fdfdfe;
--ink:#1b2230; /* near-black, faint cool */
--ink-soft:#39404d;
--muted:#7b828e;
--rule:#aac4e0; /* light-blue rule */
--line-soft:#e7ebf1;
--accent:#2f6aa8; /* deeper blue for links/emphasis */
--serif:"IBM Plex Serif",Georgia,"Times New Roman",serif;
--sans:"IBM Plex Sans",system-ui,-apple-system,"Segoe UI",sans-serif;
--maxw:800px;
}
*{box-sizing:border-box;}
html{-webkit-text-size-adjust:100%;}
body{
margin:0;background:var(--paper);color:var(--ink);
font-family:var(--serif);font-size:15.5px;line-height:1.5;font-weight:400;
}
.sheet{max-width:var(--maxw);margin:0 auto;padding:58px 56px 70px;}
a{color:var(--accent);text-decoration:none;}
a:hover{text-decoration:underline;text-underline-offset:2px;}
/* ---------- Masthead: \maketitle ---------- */
.masthead{text-align:center;padding-bottom:16px;border-bottom:1px solid var(--ink);margin-bottom:26px;}
.name{font-family:var(--serif);font-weight:600;font-size:clamp(32px,5vw,42px);letter-spacing:.01em;margin:0;}
.role{font-family:var(--sans);font-weight:500;font-size:15px;color:var(--ink-soft);margin:9px 0 0;}
.tagline{font-style:italic;font-size:14.5px;color:var(--muted);margin:7px 0 0;}
.contacts{font-family:var(--sans);font-size:12.5px;color:var(--ink-soft);margin:13px 0 0;line-height:1.7;}
.contacts a{color:var(--ink-soft);}
.contacts a:hover{color:var(--accent);}
.contacts .sep{color:var(--rule);margin:0 8px;}
/* ---------- Section: \section + \titlerule ---------- */
section{margin:0 0 16px;}
.sec-title{
font-family:var(--sans);font-size:15px;font-weight:600;letter-spacing:.01em;
color:var(--ink);margin:0 0 13px;padding-bottom:5px;border-bottom:1.5px solid var(--rule);
}
/* ---------- Body / justified ---------- */
.summary p{
font-size:15.5px;line-height:1.55;margin:0;color:var(--ink);
text-align:justify;hyphens:auto;-webkit-hyphens:auto;
}
.summary .lead{font-weight:600;}
/* ---------- Skills ---------- */
.skills-grid{display:grid;grid-template-columns:1fr 1fr;gap:11px 36px;}
.skill dt{font-family:var(--sans);font-size:12px;font-weight:600;color:var(--muted);margin:0 0 2px;}
.skill dd{margin:0;font-size:14.5px;color:var(--ink-soft);line-height:1.45;}
.skill dd b{color:var(--ink);font-weight:600;}
/* ---------- Experience ---------- */
.entry{margin:0 0 11px;}
.entry:last-child{margin-bottom:0;}
.entry-head{display:flex;justify-content:space-between;align-items:baseline;gap:16px;}
.entry-org{font-family:var(--serif);font-weight:600;font-size:17px;margin:0;}
.entry-meta{font-style:italic;font-size:13px;color:var(--muted);text-align:right;white-space:nowrap;}
.entry-role{font-style:italic;font-size:14px;color:var(--ink-soft);margin:1px 0 9px;}
.bullets{list-style:none;margin:0;padding:0;}
.bullets li{
position:relative;padding-left:16px;margin:0 0 5px;font-size:14.5px;line-height:1.46;color:var(--ink);
text-align:justify;hyphens:auto;-webkit-hyphens:auto;
}
.bullets li::before{content:"•";position:absolute;left:0;top:0;color:var(--accent);}
.bullets li b{font-weight:600;}
.metric{font-weight:600;color:var(--accent);}
/* ---------- Footer blocks ---------- */
.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:15px 36px;}
.block .sec-title{font-size:13px;}
.block p,.block li{font-size:14px;color:var(--ink);line-height:1.5;}
.block .item{margin:0 0 8px;text-align:justify;hyphens:auto;}
.block .item b{font-weight:600;}
.block .item .when{font-style:italic;color:var(--muted);}
.proj{margin:0 0 8px;font-size:14px;color:var(--ink);text-align:justify;hyphens:auto;}
.proj b{font-weight:600;}
.langs{list-style:none;padding:0;margin:0;}
.langs li{display:flex;justify-content:space-between;border-bottom:1px dotted var(--line-soft);padding:3px 0;font-size:14px;}
.langs .lvl{font-style:italic;color:var(--muted);}
/* ---------- Colophon ---------- */
.colophon{margin-top:30px;padding-top:10px;border-top:1px solid var(--line-soft);
font-family:var(--sans);font-size:11px;color:var(--muted);
display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px;}
@media (max-width:680px){
.sheet{padding:38px 22px 50px;}
.skills-grid,.grid-2{grid-template-columns:1fr;}
.entry-head{flex-direction:column;gap:1px;}
.entry-meta{text-align:left;}
}
/* ---------- Print / PDF ---------- */
@page{size:A4;margin:12mm 15mm;}
@media print{
body{background:#fff;font-size:10.3pt;line-height:1.38;}
.sheet{max-width:none;margin:0;padding:0;}
.name{font-size:25pt;}
.role{font-size:11.5pt;}
a{color:var(--accent);}
.entry-head,.skill{break-inside:avoid;}
.sec-title{break-after:avoid;}
.colophon{display:none;}
}
</style>
</head>
<body>
<div class="sheet">
<header class="masthead">
<h1 class="name">Jyri Genral</h1>
<p class="role">Senior Software Engineer - Embedded systems and Event-driven Platforms, Streaming &amp; Cloud Infrastructure</p>
<p class="tagline">Interests from the subatomic nature to the cloud</p>
<p class="contacts">
<a href="mailto:jyri@genral.fi">jyri@genral.fi</a><span class="sep">·</span>London, UK<span class="sep">·</span><a href="https://github.com/jyrama">github.com/jyrama</a><span class="sep">·</span><a href="https://www.linkedin.com/in/jyri-genral">linkedin.com/in/jyri-genral</a>
</p>
</header>
<section class="summary">
<h2 class="sec-title">Profile</h2>
<p>Senior engineer with ~8 years building the embedded systems, integration and provisioning infrastructure behind supply-chain platforms. I work end-to-end within small teams - I like designing both architecture and authoring RFCs, through implementation, Kubernetes deployment, security and on-call. I focus on embedded and event-driven systems such as Apache Kafka, workflow orchestration and infrastructure-as-code. I am triple trained in military, aviation and physics, so I like to reason things such as distributed-systems problems from first principles, eg. consensus, CRDTs, idempotency, and try to deliver back decisions with measurable outcomes. I have served not only as the all-arounder occasional lead but also as the occasional mentor, and sometimes I am a student. I write the design docs, and drive architecture across teams. Be it ending up debugging hardware or reverse-engineering, I will find a way and enjoy learning on the way from the odd challenges. That is what keeps me going.</p>
</section>
<section class="skills">
<h2 class="sec-title">Core Stack</h2>
<dl class="skills-grid">
<div class="skill"><dt>Languages</dt><dd><b>Go</b>, <b>Python</b>, <b>Rust</b>, TypeScript · SQL, Bash, Nix, C <i>(with interests in eg. Haskell and Perl)</i></dd></div>
<div class="skill"><dt>Streaming &amp; Events</dt><dd><b>Apache Kafka</b>, <b>Confluent Cloud</b>, Schema Registry · event-driven architecture, <i>and sometimes MQTT and Websockets just for fun</i></dd></div>
<div class="skill"><dt>Orchestration &amp; Runtime</dt><dd><b>Kubernetes</b>, <b>Temporal</b> · Helm, Flux (GitOps), Docker / Podman</dd></div>
<div class="skill"><dt>Infrastructure as Code</dt><dd><b>Terraform / OpenTofu</b> · GitLab CI, Azure DevOps, Nix / NixOS</dd></div>
<div class="skill"><dt>Cloud &amp; Data</dt><dd><b>Microsoft Azure</b> (AKS, Container Apps, Entra ID, networking) · PostgreSQL, CosmosDB, AWS</dd></div>
<div class="skill"><dt>Observability &amp; Security</dt><dd>Datadog, Prometheus, Vector collection pipelines, OpenTelemetry, OAuth2 & OpenID Connect, Azure Workload Identity, Hashicorp Vault, Keycloak, X509 and friends, the CycloneDX ecosystem</dd></div>
</dl>
</section>
<section class="experience">
<h2 class="sec-title">Experience</h2>
<div class="entry">
<div class="entry-head">
<h3 class="entry-org">RELEX Solutions</h3>
<span class="entry-meta">Nov 2021 - present · London / Remote</span>
</div>
<p class="entry-role">Senior Software Developer - Shared Services / Data Bridge</p>
<ul class="bullets">
<li>Tech lead for a product REST API integration -- owning systems end-to-end from RFC and architecture to production deployment and on-call on both sides.</li>
<li>Re-architected customer-infrastructure provisioning onto Temporal durable workflows and direct cloud APIs, cutting deployment latency from tens of minutes to seconds while making it idempotent and observable.</li>
<li>Designed and shipped Azure Blob Storage deployment self-service with environment-isolated RBAC (a thorough test suite preventing test→prod writes), then migrated the entire existing customer base onto it.</li>
<li>Hardened internal platform identity: implemented AKS Workload Identity (added per-tenant, least-privilege OIDC) and migrated off SAS tokens and AKV2K8S ahead of deadlines, contributing the enabling upstream platform patches.</li>
<li>Built customer data ingestion (API Gateway deployment and data validation and authz plugins (Golang) + Kafka streaming message preprocessor microservice (Rust)) and automated new-customer onboarding taking it from multiple days to maximum of hours.</li>
</ul>
</div>
<div class="entry">
<div class="entry-head">
<h3 class="entry-org">Etteplan Oyj</h3>
<span class="entry-meta">Aug 2018 - Nov 2021 · Finland</span>
</div>
<p class="entry-role">Software Designer</p>
<ul class="bullets">
<li>Delivered production Rust now sailing aboard Carnival Cruise Line's <i>Mardi&nbsp;Gras</i>, a cross-ship navigational data relay over a custom private wireless network; a Business&nbsp;Finland-backed project.</li>
<li>Embedded software and firmware in C/C++ for both battery and mains powered Bluetooth, LoRa and LoRaWAN devices, including protocol reverse-engineering and forensic reconstruction.</li>
<li>Built data-to-cloud pipelines and scientific edge-computing in Python; TypeScript / React web interfaces for industrial clients.</li>
<li>Occasional UI work in HTML5 / Typescript, JavaScript, and sometimes Python or C++</li>
</ul>
</div>
<div class="entry">
<div class="entry-head">
<h3 class="entry-org">Cinia Oy</h3>
<span class="entry-meta">Dec 2017 - Jun 2018 · Finland</span>
</div>
<p class="entry-role">Junior Software Developer</p>
<ul class="bullets">
<li>Built test automation and orchestration, regression and exploratory testing, and DevOps tooling for Java Spring Boot projects.</li>
<li>Recruited directly out of university physics studies to join the team.</li>
</ul>
</div>
</section>
<section class="leadership">
<h2 class="sec-title">Leadership &amp; Open Source</h2>
<p class="item"><b>International Association of Physics Students (IAPS)</b> <span class="when">-- President 2019-20; IT Manager &amp; Data Protection Officer 201820.</span> Led a worldwide volunteer organisation and ran its IT and GDPR compliance.</p>
<p class="item"><b>Pro-bono solutions architect &amp; tech lead</b> <span class="when">-- since 2017.</span> Hands-on architecture for IT / ICT projects backed by the Finnish state and industry, mainly for defence.</p>
<p class="proj"><b>Open source</b> · <a href="https://github.com/jyrama">github.com/jyrama</a> <i>(public mirror of selected projects on the self-hosted <a href="https://tea.jrd.fi/jyrama">tea.jrd.fi/jyrama</a>)</i></p>
</section>
<div class="grid-2">
<div class="block">
<h3 class="sec-title">Education</h3>
<p class="item"><b>Physics</b> -- University of Jyväskylä. <span class="when">Left to enter industry, 2017.</span></p>
<p class="item"><b>Private Pilot Licence, PPL(A)</b> -- Blue Skies Aviation, 2013.</p>
<p class="item"><b>Mil</b> -- Finnish Defence Forces</p>
</div>
<div class="block">
<h3 class="sec-title">Languages</h3>
<ul class="langs">
<li><span>Finnish</span><span class="lvl">native</span></li>
<li><span>English</span><span class="lvl">near-native</span></li>
<li><span>German</span><span class="lvl">basic</span></li>
<li><span>Swedish</span><span class="lvl">basic</span></li>
</ul>
</div>
<div class="block">
<h3 class="sec-title">Beyond Code</h3>
<p class="item">Electronics &amp; RF -- designed and ran <b>Radio Maxwell</b>, a compliant FM broadcast system (signal-chain design, distributed control). Embedded / FPGA / DSP tinkering with GNU Radio.</p>
<p class="item">A jack of all trades sysadmin and RF focused developer at <a href="https://mpk.fi/tietoa-meista/">MPK</a></p>
</div>
<div class="block">
<h3 class="sec-title">Interests</h3>
<p class="item">Aviation, cycling, data analytics along ML algorithms, low-level systems &amp; CPU architecture, reverse engineering, electronics and tuning the Linux kernel.</p>
</div>
</div>
<div class="colophon">
<span>Jyri Genral - Curriculum Vitae</span>
<span>Updated 25th ofJune 2026</span>
</div>
</div>
</body>
</html>