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>