Merge release/1.1.0 into main

This commit is contained in:
Bastien Chanot
2026-07-23 15:22:56 +02:00
8 changed files with 823 additions and 608 deletions
+22
View File
@@ -7,6 +7,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
## [1.1.0] — 2026-07-23
Profile geography moved to the Loire-Atlantique · Vendée · Morbihan zone, and
the CV restructured.
### Changed
- Landing profile block: `Zone` (Loire-Atlantique · Vendée · Morbihan) replaces
the former `Localisation actuelle`; every mention of Yerres and of the planned
Nantes relocation removed, including the ZenQuality timeline entry.
- Presence stated as an explicit order of preference on both surfaces — full
remote, then hybrid or on-site inside the zone, Paris only as a fallback and
capped at 1–2 days per month.
- CV restructured: technical skills promoted above professional experience,
"Centres d'intérêt" dropped, markup trimmed 656 → 424 lines.
- `CLAUDE.md` content rules: geography note rewritten to the zone model, with an
explicit guard against reintroducing Yerres.
### Added
- `CV_Bastien_CHANOT_General.{html,pdf}` — general CV variant kept beside the
served one. Repo-only: not linked from the landing, not in the Dockerfile
COPY whitelist.
## [1.0.0] — 2026-07-06 ## [1.0.0] — 2026-07-06
First tagged release. Landing page + CV live at https://bchanot.fr, served by First tagged release. Landing page + CV live at https://bchanot.fr, served by
+4 -3
View File
@@ -122,9 +122,10 @@ Forbidden:
- Profile state, including job search context, must stay consistent across - Profile state, including job search context, must stay consistent across
index.html and CV. Currently: looking for **CDI** in embedded / systems index.html and CV. Currently: looking for **CDI** in embedded / systems
software first; freelance missions (ZenQuality) in parallel. software first; freelance missions (ZenQuality) in parallel.
- Geography: Yerres (91) currently; relocation to the Nantes area (Pays de - Geography: zone **Loire-Atlantique · Vendée · Morbihan**. Never mention
la Loire) planned mid-term; full remote preferred, hybrid possible in Yerres or the Essonne. Presence, in order of preference: full remote →
Nantes, or hybrid 1–2 days/month if Paris. hybrid in the zone → on-site in the zone → Paris only as a fallback, and
only hybrid at 1–2 days per month maximum.
--- ---
+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> <!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"> <html lang="fr">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bastien Chanot — CV</title> <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> <style>
:root{ :root{
/* Zones sombres (header, footer) */ --ink:#14201a;
--dark: #0d1b12; --paper:#eeebe0;
--dark-mid: #183325; --band:#0d1b12;
--band2:#16301f;
/* Échelle verte — même teinte, 5 niveaux */ --name:#ffffff;
--g900: #0e3320; /* texte sur fond clair : très fort */ --sage:#61ab7f;
--g700: #1b5e3b; /* titres section, rôles, accroches */ --band-muted:#b7bbb8;
--g500: #2d7a4f; /* bordures accent, liens */ --green-deep:#1b5e3b;
--g300: #6ab98a; /* sur fond sombre : lisible */ --muted:#586b60;
--g100: #dff0e7; /* tag bg clair */ --rule:#d6d2c3;
--g050: #eef7f1; /* skills block bg */ --chip-bg:#e6e2d4;
--chip-bd:#cfcabb;
/* Typographie — neutrals chauds */ --chip-ink:#1b5e3b;
--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;
} }
* { margin: 0; padding: 0; box-sizing: border-box; } *{ box-sizing:border-box; margin:0; padding:0; }
html{ background:#dcdfda; }
body{ body{
background: var(--page); font-family:"IBM Plex Sans", system-ui, "Segoe UI", Roboto, sans-serif;
font-family: var(--sans); color:var(--ink);
font-size:10.4pt;
line-height:1.42;
-webkit-font-smoothing:antialiased; -webkit-font-smoothing:antialiased;
} }
.page{ .page{
background:var(--paper);
width:210mm; width:210mm;
max-width: 100%; min-height:297mm;
margin: 0 auto; margin:24px auto;
background: var(--page); padding:0;
box-shadow:0 8px 40px rgba(0,0,0,.18);
overflow:hidden; overflow:hidden;
} }
/* ── HEADER DARK BLOCK ── */ /* ---------- HEADER BAND (full-bleed) ---------- */
.cv-header { .band{
background: var(--dark); background:linear-gradient(125deg, var(--band) 0%, var(--band2) 100%);
background-image: radial-gradient(ellipse 120% 200% at 0% 50%, var(--dark-mid) 0%, var(--dark) 60%); padding:11mm 14mm 8mm;
padding: 18px 20mm 14px; }
.head{
display:flex; display:flex;
justify-content:space-between; justify-content:space-between;
gap: 20px; align-items:flex-start;
align-items: center; gap:18px;
position: relative;
overflow: hidden;
} }
.name{
.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);
font-size:26pt; font-size:26pt;
font-weight:700; font-weight:700;
color: #fff; letter-spacing:-.02em;
line-height:1; line-height:1;
letter-spacing: -0.5px; color:var(--name);
white-space: nowrap;
} }
.name em{ font-style:normal; color:var(--sage); }
.header-title { .title{
font-family: var(--mono); font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size: 9pt; font-size:9.2pt;
font-weight: 600; font-weight:500;
color: var(--g300); letter-spacing:.05em;
letter-spacing: 2.5px; color:var(--sage);
text-transform:uppercase; text-transform:uppercase;
margin-top: 6px; margin-top:7px;
opacity: 0.9;
} }
.contact{
.header-contact {
text-align:right; text-align:right;
font-family: var(--mono); font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size: 7.5pt; font-size:8.1pt;
color: rgba(255,255,255,0.55); line-height:1.75;
line-height: 1.8; color:var(--band-muted);
white-space:nowrap; 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 ── */ /* ---------- CONTENT WRAPPER ---------- */
.cv-body { .content{ padding:13px 14mm 0; }
padding: 10px 20mm 12px;
background: .status{
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"), font-family:"IBM Plex Mono", ui-monospace, monospace;
linear-gradient(160deg, var(--page) 0%, var(--tag) 55%, var(--page) 100%); font-size:8.2pt;
font-weight:500;
letter-spacing:.04em;
color:var(--sage);
margin-top:6px;
} }
.avail{
.accroche { font-family:"IBM Plex Mono", ui-monospace, monospace;
font-family: var(--serif); font-size:8.3pt;
font-style: italic; color:var(--muted);
font-weight: 400; margin:2px 0 12px 0;
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 b{ color:var(--green-deep); font-weight:600; }
.rule { /* ---------- PROFIL ---------- */
height: 1px; .profil{ margin-top:13px;
background: linear-gradient(to right, var(--rule), rgba(216,212,200,0)); font-size:10.2pt;
margin: 5px 0; 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 HEADERS ---------- */
.sec{
.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;
display:flex; display:flex;
align-items:center; 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; gap:8px;
padding:2.5px 0;
align-items:baseline;
} }
.skill-row + .skill-row{ border-top:1px solid var(--rule); }
.section-title::after { .skill-k{
content: ''; font-family:"IBM Plex Mono", ui-monospace, monospace;
flex: 1; font-size:8.2pt;
height: 1px; font-weight:500;
background: var(--rule); 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) ── */ /* ---------- EXPÉRIENCE ---------- */
.xp-header, .project-header, .edu-header { .entry{ margin-bottom:11px; }
.entry-top, .entry-role{ break-after:avoid; }
.entry-top{
display:flex; display:flex;
justify-content:space-between; justify-content:space-between;
align-items:baseline; align-items:baseline;
gap:12px;
} }
.xp-header, .project-header { margin-bottom: 1px; } .entry-co{ font-size:12pt; font-weight:600; color:var(--ink); }
.entry-date{
.xp-dates, .project-dates, .edu-dates { font-family:"IBM Plex Mono", ui-monospace, monospace;
font-family: var(--mono); font-size:8.4pt;
color: var(--ink-3); color:var(--muted);
background: var(--tag); white-space:nowrap;
padding: 1px 6px;
border-radius: 2px;
} }
.entry-role{
.xp-role, .edu-degree { font-size:9.7pt;
font-size: 10pt; color:var(--green-deep);
font-weight:500; font-weight:500;
color: var(--g700); margin:1px 0 5px;
margin-bottom: 3px; }
.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 { ul.bul li b{ color:var(--ink); font-weight:600; }
font-family: var(--mono); code.k{
font-size: 8.5pt; font-family:"IBM Plex Mono", ui-monospace, monospace;
color: var(--g900); font-size:8.4pt;
background: var(--g100); background:var(--chip-bg);
padding: 2px 8px; color:var(--chip-ink);
border-radius: 999px; border:1px solid var(--chip-bd);
} padding:.5px 4px;
.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;
border-radius:3px; border-radius:3px;
color: var(--g900);
margin: 0 1px;
white-space:nowrap; white-space:nowrap;
} }
/* ── PROJECTS ── */ /* ---------- PROJETS / FORMATION grid ---------- */
.project-block { margin-bottom: 5px; } .two{ display:grid; grid-template-columns:1fr 1fr; gap:9px 22px; }
.blk-h{ font-size:10.2pt; font-weight:600; color:var(--ink); }
.project-name { .blk-sub{
font-family: var(--mono); font-family:"IBM Plex Mono", ui-monospace, monospace;
font-size: 10.5pt; font-size:8pt; color:var(--muted); margin:1px 0 4px;
font-weight: 700;
color: var(--ink-1);
} }
.blk p{ font-size:9.4pt; line-height:1.4; color:#28332d; }
.blk a{ color:var(--green-deep); text-decoration:none; }
.project-tagline { .langs{ font-size:9.8pt; color:#22302a; margin-left:2px; }
font-size: 10pt; .langs b{ color:var(--ink); font-weight:600; }
font-weight: 500; .langs .sep{ color:var(--chip-bd); padding:0 6px; }
color: var(--g700);
font-style: italic;
}
.project-dates { font-size: 8pt; white-space: nowrap; } /* ---------- SCREEN FOOTER BAND ---------- */
.screen-foot{
.project-desc { background:var(--band);
font-size: 10pt; color:#7e8b84;
font-weight: 500; font-family:"IBM Plex Mono", ui-monospace, monospace;
color: var(--ink-2); font-size:7.6pt;
line-height: 1.45; padding:7px 14mm;
}
.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;
display:flex; display:flex;
justify-content:space-between; justify-content:space-between;
align-items: center; margin-top:18px;
} }
.screen-foot a, .pdf-foot a{ color:inherit; text-decoration:none; }
.footer-bar span { /* ---------- PDF BACKDROP + FOOTER ---------- */
font-family: var(--mono); .bg{ display:none; }
font-size: 6.8pt; .pdf-foot{ display:none; }
color: rgba(255,255,255,0.3);
}
.footer-bar a { /* ---------- PRINT / PDF ---------- */
font-family: var(--mono); /* marges : 14mm haut (sauf p.1) · 0 L/R (bleed) · 13mm bas (réserve footer) */
font-size: 6.8pt; @page{ size:A4; margin:14mm 0 13mm 0; }
color: var(--g300); @page :first{ margin-top:0; }
text-decoration: none;
opacity: 0.7;
}
/* ── PRINT ── */
@media print{ @media print{
body { html{ background:#fff; }
background: .two{ display:block; }
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"), .two .blk{ margin-bottom:7px; break-inside:avoid; }
linear-gradient(160deg, var(--page) 0%, var(--tag) 55%, var(--page) 100%); .page{ width:auto; min-height:0; margin:0; box-shadow:none; overflow:visible; background:transparent; }
} .screen-foot{ display:none; }
.page { background: transparent; } /* fond crème pleine feuille, répété chaque page (déborde dans les marges) */
.cv-header { padding: 18px 14mm 14px; } .bg{
.cv-body { padding: 10px 14mm 12px; background: transparent; } display:block; position:fixed;
top:-14mm; bottom:-13mm; left:0; right:0;
/* Saut de page forcé avant Deewee */ background:var(--paper);
.break-before-page { z-index:-1;
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;
} }
.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> </style>
</head> </head>
<body> <body>
<div class="page"> <div class="page">
<div class="bg"></div>
<div class="cv-header"> <!-- ===== HEADER BAND ===== -->
<div class="band">
<header class="head">
<div> <div>
<div class="header-name">Bastien Chanot</div> <div class="name">Bastien <em>Chanot</em></div>
<div class="header-title">Développeur Systèmes &nbsp;·&nbsp; Embarqué &nbsp;·&nbsp; Backend</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>
<div class="header-contact"> <div class="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> <a href="tel:+33778822297" class="strong">+33&nbsp;7&nbsp;78&nbsp;82&nbsp;22&nbsp;97</a><br>
Yerres (91) · installation région nantaise prévue<br> <a href="mailto:bastien@bchanot.fr">bastien@bchanot.fr</a><br>
Full remote <span class="contact-sep">·</span> hybride Nantes <span class="contact-sep">·</span> ou 1–2 j/mois Paris<br> <a href="https://bchanot.fr">bchanot.fr</a> · <a href="https://git.bchanot.fr/bchanot">git.bchanot.fr</a><br>
Permis B &amp; A<br> <!-- TODO-LIENS : remplace par tes URLs réelles -->
<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> <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> </div>
</header>
</div> </div>
<div class="cv-body"> <!-- ===== CONTENT ===== -->
<div class="content">
<div class="accroche"> <!-- ▼ ZONE 2 : ACCROCHE — réécris 2-3 lignes orientées vers l'entreprise / le poste -->
Développeur systèmes senior, 7 ans en C sur Linux bare-metal, kernel drivers et AOSP. <p class="profil">
Conception, développement et déploiement de la stack cloud gaming serveur en production 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.
(kernel, conteneurs AOSP, backend Rust temps réel, fleet GPU bare-metal) servant plusieurs centaines de joueurs simultanés. </p>
Collaboration technique directe avec Canonical (Anbox) et Nvidia. <!-- ▲ ZONE 2 -->
En recherche d'un CDI systèmes ou embarqué.
<!-- ================= 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> </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="entry">
<div class="section-title">Expérience professionnelle</div> <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>
<div class="xp-block"> <ul class="bul">
<div class="xp-header"> <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>
<span class="xp-company">ZenQuality</span> <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>
<span class="xp-dates">avr. 2026 – présent</span> <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>
</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>
</ul> </ul>
</div> </div>
<div class="xp-block"> <div class="entry">
<div class="xp-header"> <div class="entry-top"><div class="entry-co">CareGame</div><div class="entry-date">2019 — 2025</div></div>
<span class="xp-company">CareGame</span> <div class="entry-role">Développeur logiciel · Systèmes &amp; Backend <span class="meta">· Paris · full remote dès 2020</span></div>
<span class="xp-dates">mars 2019 – mars 2025</span> <!-- ▼ 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>
<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"> <div class="entry">
<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> <div class="entry-top"><div class="entry-co">Deewee</div><div class="entry-date">2017</div></div>
<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> <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>
<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> <ul class="bul">
<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>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>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>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>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>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>
<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>
</ul> </ul>
</div> </div>
</section>
<div class="xp-block break-before-page"> <!-- ================= PROJETS ================= -->
<div class="xp-header"> <section>
<span class="xp-company">Deewee</span> <div class="sec"><span class="tok">~/</span><h2>Projets &amp; réalisations</h2><span class="line"></span></div>
<span class="xp-dates">fév. 2017 – nov. 2017</span> <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>
<div class="xp-role">Développeur C — Système embarqué <span class="xp-loc">· Ivry-sur-Seine</span></div> <div class="blk">
<div class="xp-contract">Stage 42 (6 mois) puis CDD (4 mois)</div> <div class="blk-h">Code source &amp; projets persos</div>
<ul class="bullets"> <div class="blk-sub"><a href="https://git.bchanot.fr/bchanot">git.bchanot.fr/bchanot</a></div>
<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> <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>
<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> </div>
</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"> <!-- ================= LANGUES ================= -->
<div class="section-title">Projets &amp; Réalisations</div> <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><!-- /content -->
<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 class="project-block"> <div class="screen-foot"><a href="https://bchanot.fr">bchanot.fr</a><span>Bastien Chanot · CV 2026</span></div>
<div class="project-header"> <div class="pdf-foot"><a href="https://bchanot.fr">bchanot.fr</a><span>Bastien Chanot · CV 2026</span></div>
<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> </div>
</body> </body>
Binary file not shown.
+5 -5
View File
@@ -1016,17 +1016,17 @@
<p>Ce qui m'intéresse, c'est descendre jusqu'à ce qu'il n'y ait plus de magie — <strong>kernel, hardware, drivers</strong>. Là, soit ça marche, soit ça ne marche pas.</p> <p>Ce qui m'intéresse, c'est descendre jusqu'à ce qu'il n'y ait plus de magie — <strong>kernel, hardware, drivers</strong>. Là, soit ça marche, soit ça ne marche pas.</p>
<p>C'est ce confort-là que je cherche dans une équipe : <strong>systèmes, embarqué, backend bas niveau</strong>, sur une stack dont on peut lire le code source. Pas envie d'aller vers le buzzword-driven — microservices à tout prix, framework du mois, archi conçue pour le pitch deck.</p> <p>C'est ce confort-là que je cherche dans une équipe : <strong>systèmes, embarqué, backend bas niveau</strong>, sur une stack dont on peut lire le code source. Pas envie d'aller vers le buzzword-driven — microservices à tout prix, framework du mois, archi conçue pour le pitch deck.</p>
<p>Aujourd'hui indépendant sous la marque <strong>ZenQuality</strong>, mais avant tout en recherche d'un <strong>CDI en systèmes embarqués ou logiciel</strong> — les missions freelance se font en parallèle.</p> <p>Aujourd'hui indépendant sous la marque <strong>ZenQuality</strong>, mais avant tout en recherche d'un <strong>CDI en systèmes embarqués ou logiciel</strong> — les missions freelance se font en parallèle.</p>
<p>Côté présence : <strong>full remote</strong> idéalement, <strong>hybride possible sur Nantes</strong>, ou <strong>1 à 2 jours par mois</strong> si l'équipe est à Paris. Installation en <strong>région nantaise</strong> prévue à moyen terme.</p> <p>Côté présence : <strong>full remote</strong> idéalement, sinon <strong>hybride ou présentiel</strong> en <strong>Loire-Atlantique · Vendée · Morbihan</strong>. Si l'équipe est à Paris, uniquement en <strong>hybride, 1 à 2 jours par mois maximum</strong>.</p>
</div> </div>
<dl class="about-callout"> <dl class="about-callout">
<dt>Recherche prioritaire</dt> <dt>Recherche prioritaire</dt>
<dd>CDI systèmes embarqués / logiciel</dd> <dd>CDI systèmes embarqués / logiciel</dd>
<dt>En parallèle</dt> <dt>En parallèle</dt>
<dd>Missions freelance · ZenQuality</dd> <dd>Missions freelance · ZenQuality</dd>
<dt>Localisation actuelle</dt> <dt>Zone</dt>
<dd>Yerres (91) · installation région nantaise prévue</dd> <dd>Loire-Atlantique · Vendée · Morbihan</dd>
<dt>Présence</dt> <dt>Présence</dt>
<dd>Full remote · hybride Nantes · ou 1–2 j/mois Paris</dd> <dd>Full remote · hybride ou présentiel dans la zone · Paris 1–2 j/mois max</dd>
<dt>Site pro</dt> <dt>Site pro</dt>
<dd><a href="https://zenquality.fr" target="_blank" rel="noopener">zenquality.fr&nbsp;↗</a></dd> <dd><a href="https://zenquality.fr" target="_blank" rel="noopener">zenquality.fr&nbsp;↗</a></dd>
</dl> </dl>
@@ -1175,7 +1175,7 @@
<div class="timeline-meta"> <div class="timeline-meta">
<span class="period">avr.&nbsp;2026 — présent</span> <span class="period">avr.&nbsp;2026 — présent</span>
<span class="badge">En cours</span> <span class="badge">En cours</span>
<span>Yerres · Full remote</span> <span>Full remote</span>
</div> </div>
<h3><a href="https://zenquality.fr" target="_blank" rel="noopener">ZenQuality</a></h3> <h3><a href="https://zenquality.fr" target="_blank" rel="noopener">ZenQuality</a></h3>
<p class="timeline-role">Développeur indépendant · Systèmes &amp; Backend</p> <p class="timeline-role">Développeur indépendant · Systèmes &amp; Backend</p>
+1 -1
View File
@@ -1 +1 @@
1.0.0 1.1.0