chore(cv): restructured CV + general variant, zone aligned

Owner-authored CV rework: technical skills promoted above experience,
'Centres d'intérêt' dropped, markup trimmed 656 -> 424 lines. Header
carries the Loire-Atlantique · Vendée · Morbihan zone and the presence
hierarchy (full remote, hybrid or on-site in the zone, Paris capped at
1-2 days/month).

Adds CV_Bastien_CHANOT_General.{html,pdf} as the general variant kept
alongside the served CV. Not linked from the landing and not in the
Dockerfile COPY whitelist, so it ships in the repo only, not to prod.

Both HTML/PDF pairs verified in sync via weasyprint re-render (text
identical, 2 pages each). New files normalized to mode 644.
This commit is contained in:
Bastien Chanot
2026-07-23 15:22:13 +02:00
parent e2f7ea4546
commit aceb7e2c70
4 changed files with 791 additions and 599 deletions
+424
View File
@@ -0,0 +1,424 @@
<!DOCTYPE html>
<!--
=====================================================================
CV MAÎTRE — Bastien Chanot
Personnalisation par offre : édite UNIQUEMENT les 3 zones marquées
▼ ZONE 1 : TITRE (la ligne sous le nom)
▼ ZONE 2 : ACCROCHE (2-3 lignes d'objectif, à adapter à l'entreprise)
▼ ZONE 3 : ORDRE (réordonne les <li> / blocs compétences selon l'offre)
Le reste (faits, dates, réalisations) ne bouge pas.
TODO une fois pour toutes : remplace les URLs LinkedIn / GitHub réelles
dans la ligne de contact (cherche "TODO-LIENS").
Palette reprise du CV v2.
=====================================================================
-->
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bastien Chanot — CV</title>
<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+Mono:wght@400;500;600&family=IBM+Plex+Sans:ital,wght@0,400;0,500;0,600;0,700;1,400&display=swap" rel="stylesheet">
<style>
:root{
--ink:#14201a;
--paper:#eeebe0;
--band:#0d1b12;
--band2:#16301f;
--name:#ffffff;
--sage:#61ab7f;
--band-muted:#b7bbb8;
--green-deep:#1b5e3b;
--muted:#586b60;
--rule:#d6d2c3;
--chip-bg:#e6e2d4;
--chip-bd:#cfcabb;
--chip-ink:#1b5e3b;
}
*{ box-sizing:border-box; margin:0; padding:0; }
html{ background:#dcdfda; }
body{
font-family:"IBM Plex Sans", system-ui, "Segoe UI", Roboto, sans-serif;
color:var(--ink);
font-size:10.4pt;
line-height:1.42;
-webkit-font-smoothing:antialiased;
}
.page{
background:var(--paper);
width:210mm;
min-height:297mm;
margin:24px auto;
padding:0;
box-shadow:0 8px 40px rgba(0,0,0,.18);
overflow:hidden;
}
/* ---------- HEADER BAND (full-bleed) ---------- */
.band{
background:linear-gradient(125deg, var(--band) 0%, var(--band2) 100%);
padding:11mm 14mm 8mm;
}
.head{
display:flex;
justify-content:space-between;
align-items:flex-start;
gap:18px;
}
.name{
font-size:26pt;
font-weight:700;
letter-spacing:-.02em;
line-height:1;
color:var(--name);
}
.name em{ font-style:normal; color:var(--sage); }
.title{
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:9.2pt;
font-weight:500;
letter-spacing:.05em;
color:var(--sage);
text-transform:uppercase;
margin-top:7px;
}
.contact{
text-align:right;
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:8.1pt;
line-height:1.75;
color:var(--band-muted);
white-space:nowrap;
}
.contact a{ color:var(--sage); text-decoration:none; }
.contact .strong{ color:var(--name); font-weight:500; }
/* ---------- CONTENT WRAPPER ---------- */
.content{ padding:13px 14mm 0; }
.status{
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:8.2pt;
font-weight:500;
letter-spacing:.04em;
color:var(--sage);
margin-top:6px;
}
.avail{
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:8.3pt;
color:var(--muted);
margin:2px 0 12px 0;
}
.avail b{ color:var(--green-deep); font-weight:600; }
/* ---------- PROFIL ---------- */
.profil{ margin-top:13px;
font-size:10.2pt;
line-height:1.5;
color:#22302a;
border-left:3px solid var(--green-deep);
padding-left:12px;
margin:0 0 15px 0;
max-width:172mm;
}
.profil strong{ color:var(--green-deep); font-weight:600; }
/* ---------- SECTION HEADERS ---------- */
.sec{
display:flex;
align-items:center;
gap:10px;
margin:0 0 9px 0;
break-after:avoid;
}
.sec h2{
font-size:10.5pt;
font-weight:600;
letter-spacing:.13em;
text-transform:uppercase;
color:var(--ink);
white-space:nowrap;
}
.sec .tok{
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:8pt;
color:var(--green-deep);
font-weight:500;
}
.sec .line{ flex:1; height:1px; background:var(--rule); }
section{ margin-bottom:14px; }
/* ---------- COMPÉTENCES ---------- */
.skills{ margin-left:2px; }
.skill-row{
display:grid;
grid-template-columns:34mm 1fr;
gap:8px;
padding:2.5px 0;
align-items:baseline;
}
.skill-row + .skill-row{ border-top:1px solid var(--rule); }
.skill-k{
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:8.2pt;
font-weight:500;
color:var(--green-deep);
letter-spacing:.01em;
}
.skill-v{ font-size:9.6pt; color:#22302a; }
.skill-v .sep{ color:var(--chip-bd); padding:0 1px; }
/* ---------- EXPÉRIENCE ---------- */
.entry{ margin-bottom:11px; }
.entry-top, .entry-role{ break-after:avoid; }
.entry-top{
display:flex;
justify-content:space-between;
align-items:baseline;
gap:12px;
}
.entry-co{ font-size:12pt; font-weight:600; color:var(--ink); }
.entry-date{
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:8.4pt;
color:var(--muted);
white-space:nowrap;
}
.entry-role{
font-size:9.7pt;
color:var(--green-deep);
font-weight:500;
margin:1px 0 5px;
}
.entry-role .meta{ color:var(--muted); font-weight:400; }
ul.bul{ list-style:none; orphans:2; widows:2; }
ul.bul li{
list-style:"▸ ";
margin-left:13px;
margin-bottom:3.5px;
font-size:9.7pt;
line-height:1.4;
color:#212d27;
break-inside:avoid;
}
ul.bul li b{ color:var(--ink); font-weight:600; }
code.k{
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:8.4pt;
background:var(--chip-bg);
color:var(--chip-ink);
border:1px solid var(--chip-bd);
padding:.5px 4px;
border-radius:3px;
white-space:nowrap;
}
/* ---------- PROJETS / FORMATION grid ---------- */
.two{ display:grid; grid-template-columns:1fr 1fr; gap:9px 22px; }
.blk-h{ font-size:10.2pt; font-weight:600; color:var(--ink); }
.blk-sub{
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:8pt; color:var(--muted); margin:1px 0 4px;
}
.blk p{ font-size:9.4pt; line-height:1.4; color:#28332d; }
.blk a{ color:var(--green-deep); text-decoration:none; }
.langs{ font-size:9.8pt; color:#22302a; margin-left:2px; }
.langs b{ color:var(--ink); font-weight:600; }
.langs .sep{ color:var(--chip-bd); padding:0 6px; }
/* ---------- SCREEN FOOTER BAND ---------- */
.screen-foot{
background:var(--band);
color:#7e8b84;
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:7.6pt;
padding:7px 14mm;
display:flex;
justify-content:space-between;
margin-top:18px;
}
.screen-foot a, .pdf-foot a{ color:inherit; text-decoration:none; }
/* ---------- PDF BACKDROP + FOOTER ---------- */
.bg{ display:none; }
.pdf-foot{ display:none; }
/* ---------- PRINT / PDF ---------- */
/* marges : 14mm haut (sauf p.1) · 0 L/R (bleed) · 13mm bas (réserve footer) */
@page{ size:A4; margin:14mm 0 13mm 0; }
@page :first{ margin-top:0; }
@media print{
html{ background:#fff; }
.two{ display:block; }
.two .blk{ margin-bottom:7px; break-inside:avoid; }
.page{ width:auto; min-height:0; margin:0; box-shadow:none; overflow:visible; background:transparent; }
.screen-foot{ display:none; }
/* fond crème pleine feuille, répété chaque page (déborde dans les marges) */
.bg{
display:block; position:fixed;
top:-14mm; bottom:-13mm; left:0; right:0;
background:var(--paper);
z-index:-1;
}
.pdf-foot{
display:flex;
position:fixed;
bottom:-13mm; left:0; right:0;
height:9mm;
align-items:center;
justify-content:space-between;
padding:0 14mm;
background:var(--band);
color:#8a968f;
font-family:"IBM Plex Mono", monospace;
font-size:7.4pt;
}
}
</style>
</head>
<body>
<div class="page">
<div class="bg"></div>
<!-- ===== HEADER BAND ===== -->
<div class="band">
<header class="head">
<div>
<div class="name">Bastien <em>Chanot</em></div>
<!-- ▼ ZONE 1 : TITRE — adapte au poste visé (format court, séparé par ·) -->
<div class="title">Développeur Systèmes &amp; Backend · C · Rust · Linux</div>
<div class="status">CDI · disponible</div>
<!-- ▲ ZONE 1 -->
</div>
<div class="contact">
<a href="tel:+33778822297" class="strong">+33&nbsp;7&nbsp;78&nbsp;82&nbsp;22&nbsp;97</a><br>
<a href="mailto:bastien@bchanot.fr">bastien@bchanot.fr</a><br>
<a href="https://bchanot.fr">bchanot.fr</a> · <a href="https://git.bchanot.fr/bchanot">git.bchanot.fr</a><br>
<!-- TODO-LIENS : remplace par tes URLs réelles -->
<a href="https://www.linkedin.com/in/bastien-chanot-4075a0a3/">linkedin.com/in/bastien-chanot</a><br><a href="https://github.com/bchanot">github.com/bchanot</a><br>
Loire-Atlantique · Vendée · Morbihan<br>full remote ou hybride<br>Permis&nbsp;B&nbsp;&amp;&nbsp;A
</div>
</header>
</div>
<!-- ===== CONTENT ===== -->
<div class="content">
<!-- ▼ ZONE 2 : ACCROCHE — réécris 2-3 lignes orientées vers l'entreprise / le poste -->
<p class="profil">
Développeur <strong>systèmes &amp; backend</strong>, 7 ans en <strong>C et Rust sur Linux bare-metal</strong>. Du <strong>module kernel</strong> au backend temps réel : drivers, conteneurs (Docker / LXC / QEMU), exploitation d'une <strong>fleet GPU bare-metal</strong> en production, automatisation et CI/CD. Compréhension globale de la stack, du matériel au service.
</p>
<!-- ▲ ZONE 2 -->
<!-- ================= COMPÉTENCES ================= -->
<section>
<div class="sec"><span class="tok">~/</span><h2>Compétences techniques</h2><span class="line"></span></div>
<!-- ▼ ZONE 3a : réordonne les lignes selon l'offre -->
<div class="skills">
<div class="skill-row"><div class="skill-k">Langages</div><div class="skill-v">C <span class="sep">·</span> Rust <span class="sep">·</span> C++ <span class="sep">·</span> Bash <span class="sep">·</span> Python <span class="sep">·</span> Java (AOSP/Android)</div></div>
<div class="skill-row"><div class="skill-k">Systèmes &amp; Embarqué</div><div class="skill-v">Linux kernel drivers <span class="sep">·</span> AOSP <span class="sep">·</span> ARM / x86 <span class="sep">·</span> GPIO <span class="sep">·</span> NFC <span class="sep">·</span> cross-compilation GCC <span class="sep">·</span> systemd <span class="sep">·</span> SELinux</div></div>
<div class="skill-row"><div class="skill-k">Conteneurs / Virtu.</div><div class="skill-v">Docker <span class="sep">·</span> LXC / LXD <span class="sep">·</span> QEMU <span class="sep">·</span> cgroups <span class="sep">·</span> namespaces</div></div>
<div class="skill-row"><div class="skill-k">Cloud &amp; Infra</div><div class="skill-v">AWS (EC2, g4dn bare-metal, IAM, S3, CloudWatch) <span class="sep">·</span> Scaleway <span class="sep">·</span> OVH / Hetzner <span class="sep">·</span> Nginx</div></div>
<div class="skill-row"><div class="skill-k">DevOps &amp; Outils</div><div class="skill-v">Git <span class="sep">·</span> GitHub Actions <span class="sep">·</span> GitLab CI <span class="sep">·</span> CI/CD <span class="sep">·</span> Claude Code (agents/skills custom) <span class="sep">·</span> N8N</div></div>
</div>
<!-- ▲ ZONE 3a -->
</section>
<!-- ================= EXPÉRIENCE ================= -->
<section>
<div class="sec"><span class="tok">~/</span><h2>Expérience professionnelle</h2><span class="line"></span></div>
<div class="entry">
<div class="entry-top"><div class="entry-co">ZenQuality</div><div class="entry-date">2026 — présent</div></div>
<div class="entry-role">Développeur indépendant · Infra &amp; dév web <span class="meta">· zenquality.fr</span></div>
<ul class="bul">
<li>Déployé et opéré en production l'<b>infrastructure auto-hébergée</b> (uptime continu) en conteneurisant une stack <code class="k">Astro</code> <code class="k">React</code> <code class="k">PHP 8</code> <code class="k">PostgreSQL</code> sur VPS <code class="k">Scaleway</code>, avec pipeline de déploiement automatisé.</li>
<li>Livré <b>5 projets clients de bout en bout</b> depuis avril 2026 — conception, intégration, déploiement, hébergement et support continu.</li>
<li>Réalisé des <b>audits techniques</b> (Core Web Vitals, Schema.org) et la <b>mise en conformité légale</b> (RGPD, CGV B2B/B2C, médiateur CM2C) pour des PME — plan d'action sur 12 sprints.</li>
</ul>
</div>
<div class="entry">
<div class="entry-top"><div class="entry-co">CareGame</div><div class="entry-date">2019 — 2025</div></div>
<div class="entry-role">Développeur logiciel · Systèmes &amp; Backend <span class="meta">· Paris · full remote dès 2020</span></div>
<!-- ▼ ZONE 3b : remonte les bullets les plus alignés avec l'offre -->
<ul class="bul">
<li>Conçu et maintenu les <b>modules kernel Linux en C</b> (x86 / ARM) assurant la communication bidirectionnelle hôte ↔ instances AOSP conteneurisées — drivers d'interface, brique critique du pipeline d'exécution serveur.</li>
<li>Co-développé le <b>backend Rust</b> orchestrant le cycle de vie des conteneurs AOSP (<code class="k">WebSocket</code> temps réel clients ↔ instances, scheduling sur la fleet GPU, intégration <code class="k">Docker</code> + <code class="k">LXC</code>) — support de <b>plusieurs centaines de joueurs simultanés</b>.</li>
<li>Porté la densité de production à <b>32 sessions de jeu AAA stables par serveur</b> en concevant l'isolation <b>CPU/GPU par session</b> — adaptation de modules GPU <code class="k">Nvidia</code>, partitionnement 2 cœurs/session (physiques et émulés), sérialisation des accès concurrents sur zones GPU partagées.</li>
<li>Architecturé et exploité une <b>fleet GPU bare-metal</b> <code class="k">AWS g4dn.metal</code> (8× T4, 64 vCPU, ~20 serveurs en pic) servant plusieurs centaines de joueurs en parallèle — isolation 2 cœurs CPU/session, ramdisk I/O (Asphalt 9 : 3 sessions / T4).</li>
<li>Industrialisé jusqu'en production un <b>PoC LXD + Docker</b> issu d'une R&amp;D Nvidia — débogage kernel/conteneur, performance validée par les équipes Nvidia comme dépassant le scope initial du PoC.</li>
<li>Collaboré techniquement en <b>anglais</b> avec <b>Canonical</b> (Anbox, builds LXC/LXD non commerciaux, remontée bugs et feature requests) et <b>Ampere Computing</b> (benchmark de serveurs ARM pré-commerciaux pour évaluation de migration de fleet).</li>
<li>Automatisé l'installation des jeux AOSP et la persistance des sauvegardes (fusion Android Backup + scripts custom couvrant DRM et données externes) et développé un <b>outil d'orchestration Bash modulaire (1000+ lignes)</b> appelé par la CI et le backend Rust.</li>
<li>Atteint une <b>latence compatible gameplay AAA temps réel</b> en développant les virtual input devices AOSP en <code class="k">Java</code> (touchscreen, gamepad) sur le pipeline complet frontend → backend Rust → drivers hôtes → injection AOSP.</li>
</ul>
<!-- ▲ ZONE 3b -->
</div>
<div class="entry">
<div class="entry-top"><div class="entry-co">Deewee</div><div class="entry-date">2017</div></div>
<div class="entry-role">Développeur C · Système embarqué <span class="meta">· Ivry-sur-Seine · stage 42 (6 mois) puis CDD (4 mois)</span></div>
<ul class="bul">
<li>Développé en <b>C</b> le logiciel embarqué d'un boîtier connecté <code class="k">Orange Pi</code> (Debian ARM) interceptant le flux <b>ESC/POS</b> d'une imprimante thermique pour générer le PNG du ticket et le transférer en WiFi direct vers mobile.</li>
<li>Intégré le matériel : <b>GPIO</b> physique (bouton + timeout), hotspot WiFi embarqué avec appairage automatique par diffusion <b>NFC</b> des credentials.</li>
<li>Travaillé en cycle court sur un prototype fonctionnel — cross-compilation ARM, débogage sur cible, itérations rapides entre intégration matérielle et logiciel embarqué.</li>
</ul>
</div>
</section>
<!-- ================= PROJETS ================= -->
<section>
<div class="sec"><span class="tok">~/</span><h2>Projets &amp; réalisations</h2><span class="line"></span></div>
<div class="two">
<div class="blk">
<div class="blk-h">Homelab — infrastructure personnelle</div>
<div class="blk-sub">en continu</div>
<p>Auto-hébergement Git / DNS / VPN / SMB — NAS Asustor, WireGuard site-to-site, Pi-hole, segmentation réseau, hardening fail2ban, gocryptfs sur dossiers sensibles.</p>
</div>
<div class="blk">
<div class="blk-h">Code source &amp; projets persos</div>
<div class="blk-sub"><a href="https://git.bchanot.fr/bchanot">git.bchanot.fr/bchanot</a></div>
<p>Serveur Git auto-hébergé en production. Configuration Claude Code (agents/skills custom), dotfiles, projets bas-niveau C / Rust. Mirror automatique vers GitHub via push hook.</p>
</div>
</div>
</section>
<!-- ================= FORMATION ================= -->
<section>
<div class="sec"><span class="tok">~/</span><h2>Formation</h2><span class="line"></span></div>
<div class="two">
<div class="blk">
<div class="blk-h">École 42 — programmation informatique</div>
<div class="blk-sub">2015 — 2019 · Clichy</div>
<p>Kernel / systèmes (ft_linux, kfs-1, drivers, malloc), bas niveau (nm, 42sh POSIX, ft_ls), sécurité &amp; algorithmie (snow crash, ft_ssl_md5, lem-in).</p>
</div>
<div class="blk">
<div class="blk-h">TSRIT — Next Formation</div>
<div class="blk-sub">2013 — 2015 · Vincennes · Félicitations du jury</div>
<p>BTS Technicien Supérieur Réseaux &amp; Télécoms. Socle réseau (OSI, TCP/IP), administration Linux / Windows Server, virtualisation.</p>
</div>
</div>
</section>
<!-- ================= LANGUES ================= -->
<section>
<div class="sec"><span class="tok">~/</span><h2>Langues</h2><span class="line"></span></div>
<div class="langs"><b>Anglais</b> C2 <span class="sep">·</span> <b>Espagnol</b> B1 <span class="sep">·</span> <b>Français</b> natif</div>
</section>
</div><!-- /content -->
<div class="screen-foot"><a href="https://bchanot.fr">bchanot.fr</a><span>Bastien Chanot · CV 2026</span></div>
<div class="pdf-foot"><a href="https://bchanot.fr">bchanot.fr</a><span>Bastien Chanot · CV 2026</span></div>
</div>
</body>
</html>
Binary file not shown.
+324 -556
View File
@@ -1,655 +1,423 @@
<!DOCTYPE html>
<!--
=====================================================================
CV MAÎTRE — Bastien Chanot
Personnalisation par offre : édite UNIQUEMENT les 3 zones marquées
▼ ZONE 1 : TITRE (la ligne sous le nom)
▼ ZONE 2 : ACCROCHE (2-3 lignes d'objectif, à adapter à l'entreprise)
▼ ZONE 3 : ORDRE (réordonne les <li> / blocs compétences selon l'offre)
Le reste (faits, dates, réalisations) ne bouge pas.
TODO une fois pour toutes : remplace les URLs LinkedIn / GitHub réelles
dans la ligne de contact (cherche "TODO-LIENS").
Palette reprise du CV v2.
=====================================================================
-->
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bastien Chanot — CV</title>
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&family=Fraunces:ital,wght@0,700;1,300&family=DM+Sans:wght@400;500&display=swap" rel="stylesheet">
<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+Mono:wght@400;500;600&family=IBM+Plex+Sans:ital,wght@0,400;0,500;0,600;0,700;1,400&display=swap" rel="stylesheet">
<style>
:root{
/* Zones sombres (header, footer) */
--dark: #0d1b12;
--dark-mid: #183325;
/* Échelle verte — même teinte, 5 niveaux */
--g900: #0e3320; /* texte sur fond clair : très fort */
--g700: #1b5e3b; /* titres section, rôles, accroches */
--g500: #2d7a4f; /* bordures accent, liens */
--g300: #6ab98a; /* sur fond sombre : lisible */
--g100: #dff0e7; /* tag bg clair */
--g050: #eef7f1; /* skills block bg */
/* Typographie — neutrals chauds */
--ink-1: #111111; /* noms entreprises, school, titres forts */
--ink-2: #1e1e1e; /* corps de texte, bullets */
--ink-3: #636363; /* dates, lieux, labels légers */
/* Surfaces */
--page: #f5f3ec; /* fond document */
--rule: #d8d4c8; /* séparateurs */
--tag: #e6e2d8; /* tag générique */
--mono: 'JetBrains Mono', monospace;
--serif: 'Fraunces', serif;
--sans: 'DM Sans', sans-serif;
--ink:#14201a;
--paper:#eeebe0;
--band:#0d1b12;
--band2:#16301f;
--name:#ffffff;
--sage:#61ab7f;
--band-muted:#b7bbb8;
--green-deep:#1b5e3b;
--muted:#586b60;
--rule:#d6d2c3;
--chip-bg:#e6e2d4;
--chip-bd:#cfcabb;
--chip-ink:#1b5e3b;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
*{ box-sizing:border-box; margin:0; padding:0; }
html{ background:#dcdfda; }
body{
background: var(--page);
font-family: var(--sans);
font-family:"IBM Plex Sans", system-ui, "Segoe UI", Roboto, sans-serif;
color:var(--ink);
font-size:10.4pt;
line-height:1.42;
-webkit-font-smoothing:antialiased;
}
.page{
background:var(--paper);
width:210mm;
max-width: 100%;
margin: 0 auto;
background: var(--page);
min-height:297mm;
margin:24px auto;
padding:0;
box-shadow:0 8px 40px rgba(0,0,0,.18);
overflow:hidden;
}
/* ── HEADER DARK BLOCK ── */
.cv-header {
background: var(--dark);
background-image: radial-gradient(ellipse 120% 200% at 0% 50%, var(--dark-mid) 0%, var(--dark) 60%);
padding: 18px 20mm 14px;
/* ---------- HEADER BAND (full-bleed) ---------- */
.band{
background:linear-gradient(125deg, var(--band) 0%, var(--band2) 100%);
padding:11mm 14mm 8mm;
}
.head{
display:flex;
justify-content:space-between;
gap: 20px;
align-items: center;
position: relative;
overflow: hidden;
align-items:flex-start;
gap:18px;
}
.cv-header::before {
content: '';
position: absolute;
left: 0; top: 0; bottom: 0;
width: 4px;
background: linear-gradient(to bottom, var(--g300), var(--g700));
}
.cv-header::after {
content: '';
position: absolute;
right: -40px; top: -40px;
width: 200px; height: 200px;
border-radius: 50%;
background: radial-gradient(circle, rgba(45,122,79,0.12) 0%, transparent 70%);
pointer-events: none;
}
.header-name {
font-family: var(--serif);
.name{
font-size:26pt;
font-weight:700;
color: #fff;
letter-spacing:-.02em;
line-height:1;
letter-spacing: -0.5px;
white-space: nowrap;
color:var(--name);
}
.header-title {
font-family: var(--mono);
font-size: 9pt;
font-weight: 600;
color: var(--g300);
letter-spacing: 2.5px;
.name em{ font-style:normal; color:var(--sage); }
.title{
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:9.2pt;
font-weight:500;
letter-spacing:.05em;
color:var(--sage);
text-transform:uppercase;
margin-top: 6px;
opacity: 0.9;
margin-top:7px;
}
.header-contact {
.contact{
text-align:right;
font-family: var(--mono);
font-size: 7.5pt;
color: rgba(255,255,255,0.55);
line-height: 1.8;
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:8.1pt;
line-height:1.75;
color:var(--band-muted);
white-space:nowrap;
min-width: 240px;
flex-shrink: 0;
}
.contact-sep {
color: rgba(106,185,138,0.4);
margin: 0 4px;
}
.header-contact a {
color: rgba(255,255,255,0.8);
text-decoration: underline;
text-decoration-color: rgba(106,185,138,0.5);
text-underline-offset: 2px;
}
.contact a{ color:var(--sage); text-decoration:none; }
.contact .strong{ color:var(--name); font-weight:500; }
/* ── BODY ── */
.cv-body {
padding: 10px 20mm 12px;
background:
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='6' height='6'%3E%3Ccircle cx='1' cy='1' r='0.6' fill='rgba(27,94,59,0.05)'/%3E%3C/svg%3E"),
linear-gradient(160deg, var(--page) 0%, var(--tag) 55%, var(--page) 100%);
/* ---------- CONTENT WRAPPER ---------- */
.content{ padding:13px 14mm 0; }
.status{
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:8.2pt;
font-weight:500;
letter-spacing:.04em;
color:var(--sage);
margin-top:6px;
}
.accroche {
font-family: var(--serif);
font-style: italic;
font-weight: 400;
font-size: 11pt;
color: var(--ink-2);
line-height: 1.55;
border-left: 3px solid var(--g500);
padding: 5px 0 5px 12px;
margin: 8px 0;
background: linear-gradient(to right, rgba(14,51,32,0.04), transparent);
.avail{
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:8.3pt;
color:var(--muted);
margin:2px 0 12px 0;
}
.avail b{ color:var(--green-deep); font-weight:600; }
.rule {
height: 1px;
background: linear-gradient(to right, var(--rule), rgba(216,212,200,0));
margin: 5px 0;
/* ---------- PROFIL ---------- */
.profil{ margin-top:13px;
font-size:10.2pt;
line-height:1.5;
color:#22302a;
border-left:3px solid var(--green-deep);
padding-left:12px;
margin:0 0 15px 0;
max-width:172mm;
}
.profil strong{ color:var(--green-deep); font-weight:600; }
.section { margin-bottom: 6px; }
.section-title {
font-family: var(--mono);
font-size: 9pt;
font-weight: 700;
letter-spacing: 2.5px;
text-transform: uppercase;
color: var(--g700);
margin-bottom: 7px;
/* ---------- SECTION HEADERS ---------- */
.sec{
display:flex;
align-items:center;
gap:10px;
margin:0 0 9px 0;
break-after:avoid;
}
.sec h2{
font-size:10.5pt;
font-weight:600;
letter-spacing:.13em;
text-transform:uppercase;
color:var(--ink);
white-space:nowrap;
}
.sec .tok{
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:8pt;
color:var(--green-deep);
font-weight:500;
}
.sec .line{ flex:1; height:1px; background:var(--rule); }
section{ margin-bottom:14px; }
/* ---------- COMPÉTENCES ---------- */
.skills{ margin-left:2px; }
.skill-row{
display:grid;
grid-template-columns:34mm 1fr;
gap:8px;
padding:2.5px 0;
align-items:baseline;
}
.section-title::after {
content: '';
flex: 1;
height: 1px;
background: var(--rule);
.skill-row + .skill-row{ border-top:1px solid var(--rule); }
.skill-k{
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:8.2pt;
font-weight:500;
color:var(--green-deep);
letter-spacing:.01em;
}
.skill-v{ font-size:9.6pt; color:#22302a; }
.skill-v .sep{ color:var(--chip-bd); padding:0 1px; }
/* ── SHARED (xp/project/edu headers, date chips, roles, tags, links) ── */
.xp-header, .project-header, .edu-header {
/* ---------- EXPÉRIENCE ---------- */
.entry{ margin-bottom:11px; }
.entry-top, .entry-role{ break-after:avoid; }
.entry-top{
display:flex;
justify-content:space-between;
align-items:baseline;
gap:12px;
}
.xp-header, .project-header { margin-bottom: 1px; }
.xp-dates, .project-dates, .edu-dates {
font-family: var(--mono);
color: var(--ink-3);
background: var(--tag);
padding: 1px 6px;
border-radius: 2px;
.entry-co{ font-size:12pt; font-weight:600; color:var(--ink); }
.entry-date{
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:8.4pt;
color:var(--muted);
white-space:nowrap;
}
.xp-role, .edu-degree {
font-size: 10pt;
.entry-role{
font-size:9.7pt;
color:var(--green-deep);
font-weight:500;
color: var(--g700);
margin-bottom: 3px;
margin:1px 0 5px;
}
.entry-role .meta{ color:var(--muted); font-weight:400; }
ul.bul{ list-style:none; orphans:2; widows:2; }
ul.bul li{
list-style:"▸ ";
margin-left:13px;
margin-bottom:3.5px;
font-size:9.7pt;
line-height:1.4;
color:#212d27;
break-inside:avoid;
}
.lang-item, .interest-tag {
font-family: var(--mono);
font-size: 8.5pt;
color: var(--g900);
background: var(--g100);
padding: 2px 8px;
border-radius: 999px;
}
.inline-link {
color: var(--g500);
text-decoration: none;
border-bottom: 1px solid var(--g300);
}
/* ── XP ── */
.xp-block { margin-bottom: 6px; }
.xp-company {
font-family: var(--mono);
font-size: 12pt;
font-weight: 700;
color: var(--ink-1);
}
.xp-dates { font-size: 8.5pt; white-space: nowrap; }
.xp-loc {
font-size: 7.5pt;
color: var(--ink-3);
font-style: italic;
}
.xp-contract {
font-size: 8.5pt;
color: var(--ink-3);
font-style: italic;
margin-bottom: 3px;
margin-top: -2px;
}
ul.bullets { list-style: none; }
ul.bullets li {
padding-left: 13px;
position: relative;
margin-bottom: 2px;
font-size: 10pt;
font-weight: 500;
color: var(--ink-2);
line-height: 1.45;
}
ul.bullets li::before {
content: '▸';
position: absolute;
left: 0;
color: var(--g300);
font-size: 7pt;
top: 2px;
}
.tag {
display: inline-block;
background: var(--g100);
border: 1px solid var(--g300);
font-family: var(--mono);
font-size: 6.5pt;
padding: 1px 5px;
ul.bul li b{ color:var(--ink); font-weight:600; }
code.k{
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:8.4pt;
background:var(--chip-bg);
color:var(--chip-ink);
border:1px solid var(--chip-bd);
padding:.5px 4px;
border-radius:3px;
color: var(--g900);
margin: 0 1px;
white-space:nowrap;
}
/* ── PROJECTS ── */
.project-block { margin-bottom: 5px; }
.project-name {
font-family: var(--mono);
font-size: 10.5pt;
font-weight: 700;
color: var(--ink-1);
/* ---------- PROJETS / FORMATION grid ---------- */
.two{ display:grid; grid-template-columns:1fr 1fr; gap:9px 22px; }
.blk-h{ font-size:10.2pt; font-weight:600; color:var(--ink); }
.blk-sub{
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:8pt; color:var(--muted); margin:1px 0 4px;
}
.blk p{ font-size:9.4pt; line-height:1.4; color:#28332d; }
.blk a{ color:var(--green-deep); text-decoration:none; }
.project-tagline {
font-size: 10pt;
font-weight: 500;
color: var(--g700);
font-style: italic;
}
.langs{ font-size:9.8pt; color:#22302a; margin-left:2px; }
.langs b{ color:var(--ink); font-weight:600; }
.langs .sep{ color:var(--chip-bd); padding:0 6px; }
.project-dates { font-size: 8pt; white-space: nowrap; }
.project-desc {
font-size: 10pt;
font-weight: 500;
color: var(--ink-2);
line-height: 1.45;
}
.project-link {
font-family: var(--mono);
font-size: 8pt;
color: var(--g500);
margin-top: 1px;
}
/* ── SKILLS ── */
.skills-grid {
display: grid;
grid-template-columns: 115px 1fr;
gap: 1px 10px;
}
.skill-label {
font-family: var(--mono);
font-size: 9.5pt;
font-weight: 700;
color: var(--g700);
padding-top: 1px;
}
.skill-label::after {
content: " :";
}
.skill-values { font-size: 10pt; font-weight: 500; color: var(--ink-2); }
/* ── EDU ── */
.edu-block { margin-bottom: 5px; }
.edu-school {
font-family: var(--mono);
font-size: 11.5pt;
font-weight: 700;
color: var(--ink-1);
}
.edu-dates { font-size: 7.2pt; }
.edu-detail {
font-size: 10pt;
font-weight: 500;
color: var(--ink-2);
line-height: 1.55;
}
/* ── TWO COL BOTTOM ── */
.two-col {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0 20px;
}
.lang-row { display: flex; gap: 4px; flex-wrap: wrap; }
.lang-item .level {
color: var(--ink-3);
font-size: 7.5pt;
}
.interests { display: flex; flex-wrap: wrap; gap: 4px; }
/* ── FOOTER ── */
.footer-bar {
background: var(--dark);
padding: 5px 20mm;
/* ---------- SCREEN FOOTER BAND ---------- */
.screen-foot{
background:var(--band);
color:#7e8b84;
font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size:7.6pt;
padding:7px 14mm;
display:flex;
justify-content:space-between;
align-items: center;
margin-top:18px;
}
.screen-foot a, .pdf-foot a{ color:inherit; text-decoration:none; }
.footer-bar span {
font-family: var(--mono);
font-size: 6.8pt;
color: rgba(255,255,255,0.3);
}
/* ---------- PDF BACKDROP + FOOTER ---------- */
.bg{ display:none; }
.pdf-foot{ display:none; }
.footer-bar a {
font-family: var(--mono);
font-size: 6.8pt;
color: var(--g300);
text-decoration: none;
opacity: 0.7;
}
/* ── PRINT ── */
/* ---------- PRINT / PDF ---------- */
/* marges : 14mm haut (sauf p.1) · 0 L/R (bleed) · 13mm bas (réserve footer) */
@page{ size:A4; margin:14mm 0 13mm 0; }
@page :first{ margin-top:0; }
@media print{
body {
background:
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='6' height='6'%3E%3Ccircle cx='1' cy='1' r='0.6' fill='rgba(27,94,59,0.05)'/%3E%3C/svg%3E"),
linear-gradient(160deg, var(--page) 0%, var(--tag) 55%, var(--page) 100%);
}
.page { background: transparent; }
.cv-header { padding: 18px 14mm 14px; }
.cv-body { padding: 10px 14mm 12px; background: transparent; }
/* Saut de page forcé avant Deewee */
.break-before-page {
break-before: page;
page-break-before: always;
}
/* Cache le footer HTML, remplacé par le footer @page (auto-numéroté) */
.footer-bar { display: none; }
/* Footer pleine largeur sur chaque page, avec numérotation auto */
@page {
size: A4;
margin: 0 0 8mm 0;
@bottom-left-corner {
content: "\00a0";
background: #0d1b12;
}
@bottom-left {
content: "bchanot.fr";
background: #0d1b12;
color: #6ab98a;
font-family: 'JetBrains Mono', monospace;
font-size: 6.8pt;
padding-left: 20mm;
text-align: left;
vertical-align: middle;
width: 80mm;
}
@bottom-center {
content: "\00a0";
background: #0d1b12;
width: 50mm;
}
@bottom-right {
content: "Bastien Chanot · CV 2026 · " counter(page) "/" counter(pages);
background: #0d1b12;
color: rgba(255, 255, 255, 0.5);
font-family: 'JetBrains Mono', monospace;
font-size: 6.8pt;
padding-right: 20mm;
text-align: right;
vertical-align: middle;
width: 80mm;
}
@bottom-right-corner {
content: "\00a0";
background: #0d1b12;
html{ background:#fff; }
.two{ display:block; }
.two .blk{ margin-bottom:7px; break-inside:avoid; }
.page{ width:auto; min-height:0; margin:0; box-shadow:none; overflow:visible; background:transparent; }
.screen-foot{ display:none; }
/* fond crème pleine feuille, répété chaque page (déborde dans les marges) */
.bg{
display:block; position:fixed;
top:-14mm; bottom:-13mm; left:0; right:0;
background:var(--paper);
z-index:-1;
}
.pdf-foot{
display:flex;
position:fixed;
bottom:-13mm; left:0; right:0;
height:9mm;
align-items:center;
justify-content:space-between;
padding:0 14mm;
background:var(--band);
color:#8a968f;
font-family:"IBM Plex Mono", monospace;
font-size:7.4pt;
}
}
</style>
</head>
<body>
<div class="page">
<div class="bg"></div>
<div class="cv-header">
<!-- ===== HEADER BAND ===== -->
<div class="band">
<header class="head">
<div>
<div class="header-name">Bastien Chanot</div>
<div class="header-title">Développeur Systèmes &nbsp;·&nbsp; Embarqué &nbsp;·&nbsp; Backend</div>
<div class="name">Bastien <em>Chanot</em></div>
<!-- ▼ ZONE 1 : TITRE — adapte au poste visé (format court, séparé par ·) -->
<div class="title">Développeur Systèmes &amp; Backend · C · Rust · Linux</div>
<div class="status">CDI · disponible</div>
<!-- ▲ ZONE 1 -->
</div>
<div class="header-contact">
<a href="tel:+33778822297">+33 7 78 82 22 97</a> <span class="contact-sep">·</span> <a href="mailto:bastien@bchanot.fr">bastien@bchanot.fr</a><br>
Yerres (91) · installation région nantaise prévue<br>
Full remote <span class="contact-sep">·</span> hybride Nantes <span class="contact-sep">·</span> ou 1–2 j/mois Paris<br>
Permis B &amp; A<br>
<a href="https://github.com/bchanot">GitHub</a> <span class="contact-sep">·</span> <a href="https://www.linkedin.com/in/bastien-chanot-4075a0a3/">LinkedIn</a> <span class="contact-sep">·</span> <a href="https://bchanot.fr">bchanot.fr</a>
<div class="contact">
<a href="tel:+33778822297" class="strong">+33&nbsp;7&nbsp;78&nbsp;82&nbsp;22&nbsp;97</a><br>
<a href="mailto:bastien@bchanot.fr">bastien@bchanot.fr</a><br>
<a href="https://bchanot.fr">bchanot.fr</a> · <a href="https://git.bchanot.fr/bchanot">git.bchanot.fr</a><br>
<!-- TODO-LIENS : remplace par tes URLs réelles -->
<a href="https://www.linkedin.com/in/bastien-chanot-4075a0a3/">linkedin.com/in/bastien-chanot</a><br><a href="https://github.com/bchanot">github.com/bchanot</a><br>
Loire-Atlantique · Vendée · Morbihan<br>full remote, hybride ou présentiel<br>Paris : hybride 1–2&nbsp;j/mois max<br>Permis&nbsp;B&nbsp;&amp;&nbsp;A
</div>
</header>
</div>
<div class="cv-body">
<!-- ===== CONTENT ===== -->
<div class="content">
<div class="accroche">
Développeur systèmes senior, 7 ans en C sur Linux bare-metal, kernel drivers et AOSP.
Conception, développement et déploiement de la stack cloud gaming serveur en production
(kernel, conteneurs AOSP, backend Rust temps réel, fleet GPU bare-metal) servant plusieurs centaines de joueurs simultanés.
Collaboration technique directe avec Canonical (Anbox) et Nvidia.
En recherche d'un CDI systèmes ou embarqué.
<!-- ▼ ZONE 2 : ACCROCHE — réécris 2-3 lignes orientées vers l'entreprise / le poste -->
<p class="profil">
Développeur <strong>systèmes &amp; backend</strong>, 7 ans en <strong>C et Rust sur Linux bare-metal</strong>. Du <strong>module kernel</strong> au backend temps réel : drivers, conteneurs (Docker / LXC / QEMU), exploitation d'une <strong>fleet GPU bare-metal</strong> en production, automatisation et CI/CD. Compréhension globale de la stack, du matériel au service.
</p>
<!-- ▲ ZONE 2 -->
<!-- ================= COMPÉTENCES ================= -->
<section>
<div class="sec"><span class="tok">~/</span><h2>Compétences techniques</h2><span class="line"></span></div>
<!-- ▼ ZONE 3a : réordonne les lignes selon l'offre -->
<div class="skills">
<div class="skill-row"><div class="skill-k">Langages</div><div class="skill-v">C <span class="sep">·</span> Rust <span class="sep">·</span> C++ <span class="sep">·</span> Bash <span class="sep">·</span> Python <span class="sep">·</span> Java (AOSP/Android)</div></div>
<div class="skill-row"><div class="skill-k">Systèmes &amp; Embarqué</div><div class="skill-v">Linux kernel drivers <span class="sep">·</span> AOSP <span class="sep">·</span> ARM / x86 <span class="sep">·</span> GPIO <span class="sep">·</span> NFC <span class="sep">·</span> cross-compilation GCC <span class="sep">·</span> systemd <span class="sep">·</span> SELinux</div></div>
<div class="skill-row"><div class="skill-k">Conteneurs / Virtu.</div><div class="skill-v">Docker <span class="sep">·</span> LXC / LXD <span class="sep">·</span> QEMU <span class="sep">·</span> cgroups <span class="sep">·</span> namespaces</div></div>
<div class="skill-row"><div class="skill-k">Cloud &amp; Infra</div><div class="skill-v">AWS (EC2, g4dn bare-metal, IAM, S3, CloudWatch) <span class="sep">·</span> Scaleway <span class="sep">·</span> OVH / Hetzner <span class="sep">·</span> Nginx</div></div>
<div class="skill-row"><div class="skill-k">DevOps &amp; Outils</div><div class="skill-v">Git <span class="sep">·</span> GitHub Actions <span class="sep">·</span> GitLab CI <span class="sep">·</span> CI/CD <span class="sep">·</span> Claude Code (agents/skills custom) <span class="sep">·</span> N8N</div></div>
</div>
<!-- ▲ ZONE 3a -->
</section>
<div class="rule"></div>
<!-- ================= EXPÉRIENCE ================= -->
<section>
<div class="sec"><span class="tok">~/</span><h2>Expérience professionnelle</h2><span class="line"></span></div>
<div class="section">
<div class="section-title">Expérience professionnelle</div>
<div class="xp-block">
<div class="xp-header">
<span class="xp-company">ZenQuality</span>
<span class="xp-dates">avr. 2026 – présent</span>
</div>
<div class="xp-role">Développeur indépendant <span class="xp-loc">· Yerres · <a href="https://zenquality.fr" class="inline-link">zenquality.fr</a></span></div>
<ul class="bullets">
<li>Mission SEO et conformité légale RGPD pour PME service (Île-de-France) — audit technique Core Web Vitals + Schema.org + NAP, refonte CGV B2B/B2C, RGPD, mentions légales, mise en conformité médiateur CM2C. Plan d'action 12 sprints.</li>
<li>Site vitrine WordPress (<span class="tag">Gutenverse</span>) pour PME esthétique — conception, intégration, déploiement et support continu (hébergement client).</li>
<li>Setup et auto-hébergement de l'infra ZenQuality sur VPS <span class="tag">Scaleway</span> — stack <span class="tag">Astro</span> / <span class="tag">React</span> / <span class="tag">PHP 8</span> / <span class="tag">PostgreSQL</span> conteneurisée <span class="tag">Docker</span>, déploiement automatisé, pipeline de production complet.</li>
<div class="entry">
<div class="entry-top"><div class="entry-co">ZenQuality</div><div class="entry-date">2026 — présent</div></div>
<div class="entry-role">Développeur indépendant · Infra &amp; dév web <span class="meta">· zenquality.fr</span></div>
<ul class="bul">
<li>Déployé et opéré en production l'<b>infrastructure auto-hébergée</b> (uptime continu) en conteneurisant une stack <code class="k">Astro</code> <code class="k">React</code> <code class="k">PHP 8</code> <code class="k">PostgreSQL</code> sur VPS <code class="k">Scaleway</code>, avec pipeline de déploiement automatisé.</li>
<li>Livré <b>5 projets clients de bout en bout</b> depuis avril 2026 — conception, intégration, déploiement, hébergement et support continu.</li>
<li>Réalisé des <b>audits techniques</b> (Core Web Vitals, Schema.org) et la <b>mise en conformité légale</b> (RGPD, CGV B2B/B2C, médiateur CM2C) pour des PME — plan d'action sur 12 sprints.</li>
</ul>
</div>
<div class="xp-block">
<div class="xp-header">
<span class="xp-company">CareGame</span>
<span class="xp-dates">mars 2019 – mars 2025</span>
<div class="entry">
<div class="entry-top"><div class="entry-co">CareGame</div><div class="entry-date">2019 — 2025</div></div>
<div class="entry-role">Développeur logiciel · Systèmes &amp; Backend <span class="meta">· Paris · full remote dès 2020</span></div>
<!-- ▼ ZONE 3b : remonte les bullets les plus alignés avec l'offre -->
<ul class="bul">
<li>Conçu et maintenu les <b>modules kernel Linux en C</b> (x86 / ARM) assurant la communication bidirectionnelle hôte ↔ instances AOSP conteneurisées — drivers d'interface, brique critique du pipeline d'exécution serveur.</li>
<li>Co-développé le <b>backend Rust</b> orchestrant le cycle de vie des conteneurs AOSP (<code class="k">WebSocket</code> temps réel clients ↔ instances, scheduling sur la fleet GPU, intégration <code class="k">Docker</code> + <code class="k">LXC</code>) — support de <b>plusieurs centaines de joueurs simultanés</b>.</li>
<li>Porté la densité de production à <b>32 sessions de jeu AAA stables par serveur</b> en concevant l'isolation <b>CPU/GPU par session</b> — adaptation de modules GPU <code class="k">Nvidia</code>, partitionnement 2 cœurs/session (physiques et émulés), sérialisation des accès concurrents sur zones GPU partagées.</li>
<li>Architecturé et exploité une <b>fleet GPU bare-metal</b> <code class="k">AWS g4dn.metal</code> (8× T4, 64 vCPU, ~20 serveurs en pic) servant plusieurs centaines de joueurs en parallèle — isolation 2 cœurs CPU/session, ramdisk I/O (Asphalt 9 : 3 sessions / T4).</li>
<li>Industrialisé jusqu'en production un <b>PoC LXD + Docker</b> issu d'une R&amp;D Nvidia — débogage kernel/conteneur, performance validée par les équipes Nvidia comme dépassant le scope initial du PoC.</li>
<li>Collaboré techniquement en <b>anglais</b> avec <b>Canonical</b> (Anbox, builds LXC/LXD non commerciaux, remontée bugs et feature requests) et <b>Ampere Computing</b> (benchmark de serveurs ARM pré-commerciaux pour évaluation de migration de fleet).</li>
<li>Automatisé l'installation des jeux AOSP et la persistance des sauvegardes (fusion Android Backup + scripts custom couvrant DRM et données externes) et développé un <b>outil d'orchestration Bash modulaire (1000+ lignes)</b> appelé par la CI et le backend Rust.</li>
<li>Atteint une <b>latence compatible gameplay AAA temps réel</b> en développant les virtual input devices AOSP en <code class="k">Java</code> (touchscreen, gamepad) sur le pipeline complet frontend → backend Rust → drivers hôtes → injection AOSP.</li>
</ul>
<!-- ▲ ZONE 3b -->
</div>
<div class="xp-role">Développeur logiciel — Systèmes &amp; Backend <span class="xp-loc">· Paris · Full remote dès 2020</span></div>
<ul class="bullets">
<li>Conception et maintenance de modules kernel Linux en <span class="tag">C</span> (x86 / ARM) — drivers d'interface hôte/conteneur orchestrant la communication bidirectionnelle entre Linux hôte et instances AOSP conteneurisées.</li>
<li>Conception de l'isolation CPU/GPU par session sur la fleet bare-metal — adaptation de modules GPU Nvidia, partitionnement 2 cœurs/session (physiques et émulés), sérialisation des accès concurrents sur zones GPU partagées. Résultat : passage à 32 sessions AAA stables/serveur.</li>
<li>Co-développement du backend <span class="tag">Rust</span> orchestrant le cycle de vie des conteneurs AOSP — communication WebSocket temps réel clients ↔ instances, intégration <span class="tag">Docker</span> et <span class="tag">LXC</span>, scheduling des sessions sur la fleet GPU.</li>
<li>Développement de virtual input devices AOSP en <span class="tag">Java</span> (touchscreen, gamepad) — pipeline complet inputs frontend → backend Rust → drivers hôtes → injection AOSP, optimisé pour latence temps réel gameplay AAA.</li>
<li>Architecture et exploitation de fleet GPU bare-metal <span class="tag">AWS g4dn.metal</span> (8× GPU T4, 64 vCPU, ~20 serveurs en pic) — isolation 2 cœurs CPU/session, ramdisk I/O, 32 sessions AAA simultanées par serveur. Plusieurs centaines de joueurs servis en parallèle (Asphalt 9 : 3 sessions / GPU T4).</li>
<li>Reprise et hardening d'un PoC <span class="tag">LXD</span> + <span class="tag">Docker</span> issu d'une R&amp;D Nvidia (intégration côté Docker principalement) — adaptation à la production cloud gaming, débogage kernel/conteneur, performance validée par les équipes Nvidia comme dépassant le scope initial du PoC.</li>
<li>Collaboration technique directe en anglais avec Canonical (<span class="tag">Anbox</span> + builds LXC/LXD non commerciaux, remontée bugs et feature requests) et Ampere Computing (intégration et benchmark de serveurs ARM pré-commerciaux pour évaluation de migration de fleet).</li>
<li>Pipeline d'installation automatique de jeux AOSP et persistance des sauvegardes utilisateur — fusion Android Backup natif + scripts custom pour couvrir les cas non gérés nativement (DRM, données externes).</li>
<li>Développement d'un outil d'orchestration <span class="tag">Bash</span> modulaire (1000+ lignes) pour la gestion du cycle de vie des conteneurs et l'intégration en production — parsing avancé des arguments Docker, préparation et lancement automatisé des conteneurs AOSP, brique appelée par la CI et le backend Rust.</li>
<div class="entry">
<div class="entry-top"><div class="entry-co">Deewee</div><div class="entry-date">2017</div></div>
<div class="entry-role">Développeur C · Système embarqué <span class="meta">· Ivry-sur-Seine · stage 42 (6 mois) puis CDD (4 mois)</span></div>
<ul class="bul">
<li>Développé en <b>C</b> le logiciel embarqué d'un boîtier connecté <code class="k">Orange Pi</code> (Debian ARM) interceptant le flux <b>ESC/POS</b> d'une imprimante thermique pour générer le PNG du ticket et le transférer en WiFi direct vers mobile.</li>
<li>Intégré le matériel : <b>GPIO</b> physique (bouton + timeout), hotspot WiFi embarqué avec appairage automatique par diffusion <b>NFC</b> des credentials.</li>
<li>Travaillé en cycle court sur un prototype fonctionnel — cross-compilation ARM, débogage sur cible, itérations rapides entre intégration matérielle et logiciel embarqué.</li>
</ul>
</div>
</section>
<div class="xp-block break-before-page">
<div class="xp-header">
<span class="xp-company">Deewee</span>
<span class="xp-dates">fév. 2017 – nov. 2017</span>
<!-- ================= PROJETS ================= -->
<section>
<div class="sec"><span class="tok">~/</span><h2>Projets &amp; réalisations</h2><span class="line"></span></div>
<div class="two">
<div class="blk">
<div class="blk-h">Homelab — infrastructure personnelle</div>
<div class="blk-sub">en continu</div>
<p>Auto-hébergement Git / DNS / VPN / SMB — NAS Asustor, WireGuard site-to-site, Pi-hole, segmentation réseau, hardening fail2ban, gocryptfs sur dossiers sensibles.</p>
</div>
<div class="xp-role">Développeur C — Système embarqué <span class="xp-loc">· Ivry-sur-Seine</span></div>
<div class="xp-contract">Stage 42 (6 mois) puis CDD (4 mois)</div>
<ul class="bullets">
<li>Développement du logiciel embarqué en <span class="tag">C</span> pour boîtier connecté basé Orange Pi (<span class="tag">Debian ARM</span>) — interception du flux <span class="tag">ESC/POS</span> d'une imprimante thermique, génération PNG du ticket, transfert WiFi direct vers application mobile à la connexion.</li>
<li>Intégration matérielle : <span class="tag">GPIO</span> physique (bouton + timeout), hotspot WiFi embarqué avec diffusion des credentials via <span class="tag">NFC</span> pour appairage automatique.</li>
</ul>
<div class="blk">
<div class="blk-h">Code source &amp; projets persos</div>
<div class="blk-sub"><a href="https://git.bchanot.fr/bchanot">git.bchanot.fr/bchanot</a></div>
<p>Serveur Git auto-hébergé en production. Configuration Claude Code (agents/skills custom), dotfiles, projets bas-niveau C / Rust. Mirror automatique vers GitHub via push hook.</p>
</div>
</div>
</section>
<div class="rule"></div>
<!-- ================= FORMATION ================= -->
<section>
<div class="sec"><span class="tok">~/</span><h2>Formation</h2><span class="line"></span></div>
<div class="two">
<div class="blk">
<div class="blk-h">École 42 — programmation informatique</div>
<div class="blk-sub">2015 — 2019 · Clichy</div>
<p>Kernel / systèmes (ft_linux, kfs-1, drivers, malloc), bas niveau (nm, 42sh POSIX, ft_ls), sécurité &amp; algorithmie (snow crash, ft_ssl_md5, lem-in).</p>
</div>
<div class="blk">
<div class="blk-h">TSRIT — Next Formation</div>
<div class="blk-sub">2013 — 2015 · Vincennes · Félicitations du jury</div>
<p>BTS Technicien Supérieur Réseaux &amp; Télécoms. Socle réseau (OSI, TCP/IP), administration Linux / Windows Server, virtualisation.</p>
</div>
</div>
</section>
<div class="section">
<div class="section-title">Projets &amp; Réalisations</div>
<!-- ================= LANGUES ================= -->
<section>
<div class="sec"><span class="tok">~/</span><h2>Langues</h2><span class="line"></span></div>
<div class="langs"><b>Anglais</b> C2 <span class="sep">·</span> <b>Espagnol</b> B1 <span class="sep">·</span> <b>Français</b> natif</div>
</section>
<div class="project-block">
<div class="project-header">
<div>
<span class="project-name">Code source &amp; projets persos</span>
<span class="project-tagline"> — serveur Git auto-hébergé en production</span>
</div>
<span class="project-dates">en continu</span>
</div>
<div class="project-desc">
Configuration Claude Code, dotfiles, projets bas-niveau (42, expérimentations C/Rust) — accessibles publiquement. Mirror automatique vers GitHub via push hook.
</div>
<div class="project-link"><a href="https://git.bchanot.fr/bchanot" class="inline-link">git.bchanot.fr/bchanot</a></div>
</div>
</div><!-- /content -->
<div class="project-block">
<div class="project-header">
<div>
<span class="project-name">Homelab</span>
<span class="project-tagline"> — Infrastructure personnelle</span>
</div>
<span class="project-dates">en continu</span>
</div>
<div class="project-desc">
Auto-hébergement Git (<span class="tag">Gogs</span>) / DNS / VPN / SMB — NAS Asustor, Freebox <span class="tag">WireGuard</span> VPN site-to-site, Pi-hole, segmentation réseau, hardening <span class="tag">fail2ban</span>, <span class="tag">gocryptfs</span> sur dossiers sensibles.
</div>
</div>
</div>
<div class="rule"></div>
<div class="section">
<div class="section-title">Formation</div>
<div class="edu-block">
<div class="edu-header">
<span class="edu-school">École 42</span>
<span class="edu-dates">2015 – 2019</span>
</div>
<div class="edu-degree">Programmation informatique <span class="xp-loc">· Clichy</span></div>
<div class="edu-detail">
<strong>Systèmes / Kernel :</strong> ft_linux &amp; kfs-1 (Linux From Scratch — bootloader ASM, GDT, interruptions, driver char device) · drivers &amp; interrupt · process &amp; memory · little penguin<br>
<strong>Bas niveau :</strong> malloc (allocateur mémoire) · nm (parsing ELF) · ft_ls · ft_select · 42sh (shell POSIX complet)<br>
<strong>Réseau / Sécurité :</strong> ft_ssl_md5 (crypto) · snow crash (exploitation système) · lem-in · push-swap · doctor quine
</div>
</div>
<div class="edu-block">
<div class="edu-header">
<span class="edu-school">Next Formation</span>
<span class="edu-dates">2013 – 2015</span>
</div>
<div class="edu-degree">TSRIT — Technicien Supérieur Réseaux &amp; Télécoms, <em>Félicitations du jury</em> <span class="xp-loc">· Vincennes</span></div>
</div>
</div>
<div class="rule"></div>
<div class="section">
<div class="section-title">Compétences techniques</div>
<div class="skills-grid">
<div class="skill-label">Langages</div>
<div class="skill-values">C · Rust · Bash · Python · Java (AOSP/Android)</div>
<div class="skill-label">Embarqué</div>
<div class="skill-values">Linux kernel drivers · AOSP · ARM / x86 · GPIO · NFC · ESC/POS · Orange Pi · cross-compilation GCC</div>
<div class="skill-label">Conteneurs</div>
<div class="skill-values">Docker · LXC / LXD · QEMU · cgroups · namespaces</div>
<div class="skill-label">Backend</div>
<div class="skill-values">Rust · WebSocket · architecture GPU bare-metal · ramdisk I/O</div>
<div class="skill-label">Systèmes</div>
<div class="skill-values">Linux bare-metal · AOSP · Android Backup · systemd · SELinux</div>
<div class="skill-label">Cloud / Infra</div>
<div class="skill-values">AWS (EC2, g4dn bare-metal, IAM, S3, CloudWatch) · Scaleway VPS · OVH / Hetzner · Nginx · Apache · Let's Encrypt</div>
<div class="skill-label">DevOps</div>
<div class="skill-values">Git · GitHub Actions · GitLab · CI/CD</div>
<div class="skill-label">IA / Outils</div>
<div class="skill-values">Claude Code (agents/skills custom) · N8N · automatisation</div>
<div class="skill-label">Familier avec</div>
<div class="skill-values">C++</div>
</div>
</div>
<div class="rule"></div>
<div class="two-col">
<div class="section">
<div class="section-title">Langues</div>
<div class="lang-row">
<div class="lang-item">Anglais <span class="level">C2</span></div>
<div class="lang-item">Espagnol <span class="level">B1</span></div>
<div class="lang-item">Français <span class="level">natif</span></div>
</div>
</div>
<div class="section">
<div class="section-title">Centres d'intérêt</div>
<div class="interests">
<span class="interest-tag">Voyage</span>
<span class="interest-tag">Sciences</span>
<span class="interest-tag">Astronomie</span>
<span class="interest-tag">Nature</span>
<span class="interest-tag">Jeux vidéo</span>
<span class="interest-tag">Musique</span>
</div>
</div>
</div>
</div>
<div class="footer-bar">
<a href="https://bchanot.fr">bchanot.fr</a>
<span>Bastien Chanot · CV 2026</span>
</div>
<div class="screen-foot"><a href="https://bchanot.fr">bchanot.fr</a><span>Bastien Chanot · CV 2026</span></div>
<div class="pdf-foot"><a href="https://bchanot.fr">bchanot.fr</a><span>Bastien Chanot · CV 2026</span></div>
</div>
</body>
Binary file not shown.