<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>enprod.fr – Je vous aide à finaliser votre prototype commencé avec l'IA.</title>
<meta name="description" content="Freelance fullstack : passage en production de MVP (IA ou classique), sécurisation, scalabilité et déblocage de projets tech. Christophe Surbier, 20+ ans d'expérience. Réponse sous 48h.">
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
<meta name="author" content="Christophe Surbier">
<meta name="theme-color" content="#0d0f14">
<link rel="canonical" href="https://enprod.fr/">
<link rel="alternate" hreflang="fr" href="https://enprod.fr/">
<link rel="alternate" hreflang="x-default" href="https://enprod.fr/">
<meta property="og:locale" content="fr_FR">
<meta property="og:type" content="website">
<meta property="og:url" content="https://enprod.fr/">
<meta property="og:site_name" content="enprod.fr">
<meta property="og:title" content="enprod.fr – Je conclus ce que l'IA a commencé.">
<meta property="og:description" content="Freelance fullstack : passage en production de MVP (IA ou classique), sécurisation, scalabilité et déblocage de projets tech. Réponse sous 48h.">
<meta property="og:image" content="https://enprod.fr/og-image.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="enprod.fr — MVP et projets tech en production">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="enprod.fr – Je conclus ce que l'IA a commencé.">
<meta name="twitter:description" content="Freelance fullstack : MVP en prod, sécurisation, déblocage de projets. Réponse sous 48h.">
<meta name="twitter:image" content="https://enprod.fr/og-image.jpg">
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-EFY2ZQENV8"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-EFY2ZQENV8');
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebSite",
"@id": "https://enprod.fr/#website",
"url": "https://enprod.fr/",
"name": "enprod.fr",
"description": "Accompagnement pour passer un MVP en production, sécuriser et débloquer des projets logiciels (Python, Django, Angular, cloud).",
"inLanguage": "fr-FR",
"publisher": { "@id": "https://enprod.fr/#organization" }
},
{
"@type": "WebPage",
"@id": "https://enprod.fr/#webpage",
"url": "https://enprod.fr/",
"name": "enprod.fr – Je conclus ce que l'IA a commencé.",
"description": "Freelance fullstack : passage en production de MVP (IA ou classique), sécurisation, scalabilité et déblocage de projets tech. Réponse sous 48h.",
"isPartOf": { "@id": "https://enprod.fr/#website" },
"about": { "@id": "https://enprod.fr/#professional-service" },
"inLanguage": "fr-FR"
},
{
"@type": "Organization",
"@id": "https://enprod.fr/#organization",
"name": "enprod.fr",
"url": "https://enprod.fr/",
"description": "Prestations freelance de développement fullstack et mise en production.",
"founder": { "@id": "https://enprod.fr/#christophe-surbier" }
},
{
"@type": "ProfessionalService",
"@id": "https://enprod.fr/#professional-service",
"name": "Mise en production MVP & déblocage projets tech",
"description": "Audit, structuration, sécurisation et déploiement réel de MVP (dont code généré par IA), reprise de projets bloqués, scalabilité et closing avant livraison.",
"url": "https://enprod.fr/",
"provider": { "@id": "https://enprod.fr/#organization" },
"areaServed": { "@type": "Country", "name": "France" },
"knowsAbout": ["Développement web", "Python", "Django", "Angular", "Cloud computing", "MVP", "Sécurité applicative"]
},
{
"@type": "Person",
"@id": "https://enprod.fr/#christophe-surbier",
"name": "Christophe Surbier",
"givenName": "Christophe",
"familyName": "Surbier",
"url": "https://enprod.fr/a-propos.html",
"jobTitle": "Développeur fullstack freelance",
"knowsAbout": ["Python", "Django", "Angular", "Capacitor", "Cloud"],
"sameAs": [
"https://www.malt.fr/profile/christophesurbier",
"https://www.freelance-fullstack.dev"
],
"worksFor": { "@id": "https://enprod.fr/#organization" }
}
]
}
</script>
<link href="https://fonts.googleapis.com/css2?family=Syne:wght@400;600;700;800&family=DM+Sans:ital,wght@0,300;0,400;0,500;1,300&display=swap" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/iconify-icon@2/dist/iconify-icon.min.js" defer></script>
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg: #0d0f14;
--surface: #151820;
--border: #1f2430;
--accent: #f0a500;
--accent2: #e05c2a;
--text: #e8eaf0;
--muted: #7a8099;
--soft: #c5c9d8;
}
html { scroll-behavior: smooth; }
body {
font-family: 'DM Sans', sans-serif;
background: var(--bg);
color: var(--text);
overflow-x: hidden;
line-height: 1.6;
}
/* NAV */
nav {
position: fixed; top: 0; left: 0; right: 0; z-index: 100;
display: flex; justify-content: space-between; align-items: center;
padding: 1.2rem 5%;
background: rgba(13,15,20,0.85);
backdrop-filter: blur(12px);
border-bottom: 1px solid var(--border);
}
.logo {
font-family: 'Syne', sans-serif;
font-weight: 800;
font-size: 1.1rem;
letter-spacing: -0.02em;
}
.logo span { color: var(--accent); }
.nav-links { display: flex; align-items: center; gap: 2rem; }
.nav-links a {
color: var(--muted);
text-decoration: none;
font-size: 0.88rem;
transition: color 0.2s;
}
.nav-links a:hover { color: var(--text); }
/* TARIFS TEASER */
.tarifs-teaser {
background: var(--surface);
border-top: 1px solid var(--border);
border-bottom: 1px solid var(--border);
padding: 5rem 5%;
display: flex; justify-content: space-between; align-items: center;
gap: 3rem; flex-wrap: wrap;
}
.tarifs-teaser-left { max-width: 560px; }
.tarifs-teaser h2 {
font-family: 'Syne', sans-serif;
font-weight: 700;
font-size: clamp(1.5rem, 3vw, 2.2rem);
letter-spacing: -0.025em;
margin-bottom: 0.8rem;
line-height: 1.2;
}
.tarifs-teaser h2 em {
font-style: normal;
background: linear-gradient(135deg, var(--accent), var(--accent2));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.tarifs-teaser p { color: var(--muted); font-size: 0.95rem; line-height: 1.7; }
.tarifs-pills {
display: flex; flex-wrap: wrap; gap: 0.6rem;
margin-top: 1.5rem;
}
.tarifs-pill {
background: rgba(240,165,0,0.07);
border: 1px solid rgba(240,165,0,0.18);
color: var(--soft);
font-size: 0.82rem;
padding: 0.4rem 0.9rem;
border-radius: 100px;
}
.tarifs-pill strong { color: var(--accent); }
.tarifs-teaser-right { flex-shrink: 0; }
.btn-outline-accent {
display: inline-block;
border: 1.5px solid var(--accent);
color: var(--accent);
font-family: 'Syne', sans-serif;
font-weight: 700;
font-size: 0.95rem;
padding: 0.9rem 2rem;
border-radius: 6px;
text-decoration: none;
transition: background 0.2s, color 0.2s;
}
.btn-outline-accent:hover { background: var(--accent); color: #0d0f14; }
.nav-cta {
background: var(--accent);
color: #0d0f14;
font-weight: 600;
font-size: 0.85rem;
padding: 0.55rem 1.2rem;
border-radius: 4px;
text-decoration: none;
transition: opacity 0.2s;
}
.nav-cta:hover { opacity: 0.85; }
.nav-toggle {
display: none;
flex-shrink: 0;
flex-direction: column;
justify-content: center;
align-items: center;
gap: 5px;
width: 44px;
height: 44px;
margin-left: auto;
padding: 0;
border: none;
background: transparent;
color: var(--text);
cursor: pointer;
border-radius: 6px;
}
.nav-toggle:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.nav-toggle-bar {
display: block;
width: 22px;
height: 2px;
background: currentColor;
border-radius: 1px;
transition: transform 0.2s ease, opacity 0.2s ease;
}
nav.is-open .nav-toggle-bar:nth-child(1) { transform: translateY(7px) rotate(45deg); }
nav.is-open .nav-toggle-bar:nth-child(2) { opacity: 0; }
nav.is-open .nav-toggle-bar:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }
@media (max-width: 900px) {
nav { flex-wrap: wrap; row-gap: 0; }
.nav-toggle { display: inline-flex; }
.nav-links {
display: none;
flex-basis: 100%;
flex-direction: column;
align-items: stretch;
gap: 0;
padding-top: 0;
margin-top: 0;
border-top: 1px solid transparent;
}
nav.is-open .nav-links {
display: flex;
padding-top: 1rem;
margin-top: 0.75rem;
border-top-color: var(--border);
}
.nav-links > a:not(.nav-cta) {
padding: 0.75rem 0;
font-size: 0.95rem;
border-bottom: 1px solid var(--border);
}
.nav-links .nav-cta {
margin-top: 0.75rem;
text-align: center;
}
}
/* HERO */
.hero {
min-height: 100vh;
display: flex; flex-direction: column; justify-content: center;
padding: 8rem 5% 5rem;
position: relative;
overflow: hidden;
}
.hero-bg {
position: absolute; inset: 0; z-index: 0;
background:
radial-gradient(ellipse 60% 50% at 80% 30%, rgba(240,165,0,0.07) 0%, transparent 70%),
radial-gradient(ellipse 40% 40% at 20% 70%, rgba(224,92,42,0.05) 0%, transparent 60%);
}
.grid-overlay {
position: absolute; inset: 0; z-index: 0;
background-image:
linear-gradient(rgba(255,255,255,0.02) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,0.02) 1px, transparent 1px);
background-size: 60px 60px;
}
.hero-content { position: relative; z-index: 1; max-width: 820px; }
.badge {
display: inline-flex; align-items: center; gap: 0.5rem;
background: rgba(240,165,0,0.1);
border: 1px solid rgba(240,165,0,0.25);
color: var(--accent);
font-size: 0.78rem;
font-weight: 500;
letter-spacing: 0.08em;
text-transform: uppercase;
padding: 0.4rem 0.9rem;
border-radius: 100px;
margin-bottom: 2rem;
animation: fadeUp 0.6s ease both;
}
.badge::before {
content: '';
width: 7px; height: 7px;
background: var(--accent);
border-radius: 50%;
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.4; transform: scale(0.8); }
}
h1 {
font-family: 'Syne', sans-serif;
font-weight: 800;
font-size: clamp(2.4rem, 5.5vw, 4.2rem);
line-height: 1.08;
letter-spacing: -0.03em;
margin-bottom: 1.6rem;
animation: fadeUp 0.6s 0.1s ease both;
}
h1 em {
font-style: normal;
background: linear-gradient(135deg, var(--accent), var(--accent2));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.hero-sub {
font-size: 1.1rem;
color: var(--soft);
max-width: 560px;
font-weight: 300;
margin-bottom: 2.5rem;
animation: fadeUp 0.6s 0.2s ease both;
}
.hero-actions {
display: flex; gap: 1rem; flex-wrap: wrap;
animation: fadeUp 0.6s 0.3s ease both;
}
.btn-primary {
background: var(--accent);
color: #0d0f14;
font-family: 'DM Sans', sans-serif;
font-weight: 600;
font-size: 0.95rem;
padding: 0.85rem 2rem;
border-radius: 5px;
text-decoration: none;
transition: transform 0.2s, box-shadow 0.2s;
box-shadow: 0 0 30px rgba(240,165,0,0.15);
}
.btn-primary:hover { transform: translateY(-2px); box-shadow: 0 8px 30px rgba(240,165,0,0.25); }
.btn-secondary {
border: 1px solid var(--border);
color: var(--soft);
font-size: 0.95rem;
padding: 0.85rem 2rem;
border-radius: 5px;
text-decoration: none;
transition: border-color 0.2s, color 0.2s;
}
.btn-secondary:hover { border-color: var(--muted); color: var(--text); }
.hero-stats {
display: flex; gap: 2.5rem; margin-top: 4rem;
animation: fadeUp 0.6s 0.4s ease both;
}
.stat-item { display: flex; flex-direction: column; gap: 0.2rem; }
.stat-value {
font-family: 'Syne', sans-serif;
font-weight: 700;
font-size: 1.6rem;
color: var(--accent);
}
.stat-label { font-size: 0.8rem; color: var(--muted); }
@keyframes fadeUp {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
/* SECTIONS */
section { padding: 6rem 5%; }
.section-label {
font-size: 0.75rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--accent);
font-weight: 600;
margin-bottom: 0.8rem;
}
.section-title {
font-family: 'Syne', sans-serif;
font-weight: 700;
font-size: clamp(1.8rem, 3.5vw, 2.6rem);
letter-spacing: -0.025em;
margin-bottom: 1rem;
line-height: 1.15;
}
.section-sub {
color: var(--muted);
font-size: 1rem;
max-width: 480px;
margin-bottom: 3.5rem;
}
/* PROBLEMS */
.problems-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1px;
background: var(--border);
border: 1px solid var(--border);
border-radius: 10px;
overflow: hidden;
}
.problem-card {
background: var(--surface);
padding: 2rem;
transition: background 0.25s;
cursor: default;
}
.problem-card:hover { background: #1a1f2e; }
.problem-icon {
margin-bottom: 1rem;
display: block;
line-height: 0;
}
.problem-icon iconify-icon {
width: 1.65rem;
height: 1.65rem;
color: var(--accent);
}
.problem-icon--accent2 iconify-icon { color: var(--accent2); }
.problem-icon--soft iconify-icon { color: var(--soft); }
.pill-icon {
display: inline-flex;
align-items: center;
gap: 0.35rem;
}
.pill-icon iconify-icon {
width: 0.95rem;
height: 0.95rem;
flex-shrink: 0;
}
.about-avatar-icon iconify-icon {
width: 2rem;
height: 2rem;
color: var(--muted);
}
.problem-tag {
font-size: 0.7rem;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--accent2);
font-weight: 600;
margin-bottom: 0.6rem;
}
.problem-title {
font-family: 'Syne', sans-serif;
font-weight: 700;
font-size: 1rem;
margin-bottom: 0.7rem;
line-height: 1.3;
}
.problem-desc {
font-size: 0.88rem;
color: var(--muted);
line-height: 1.6;
}
/* PROCESS */
.process-section {
background: var(--surface);
border-top: 1px solid var(--border);
border-bottom: 1px solid var(--border);
}
.process-steps {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 2rem;
margin-top: 3rem;
}
.step { display: flex; flex-direction: column; gap: 0.8rem; }
.step-num {
font-family: 'Syne', sans-serif;
font-weight: 800;
font-size: 2.5rem;
color: rgba(240, 165, 0, 0.42);
line-height: 1;
margin-bottom: 0.2rem;
}
.step-title {
font-family: 'Syne', sans-serif;
font-weight: 700;
font-size: 1rem;
}
.step-desc { font-size: 0.88rem; color: var(--muted); }
/* CTA */
.cta-section {
text-align: center;
padding: 6rem 5%;
position: relative;
overflow: hidden;
}
.cta-bg {
position: absolute; inset: 0;
background: radial-gradient(ellipse 70% 60% at 50% 50%, rgba(240,165,0,0.06) 0%, transparent 70%);
}
.cta-section h2 {
font-family: 'Syne', sans-serif;
font-weight: 800;
font-size: clamp(1.8rem, 4vw, 3rem);
letter-spacing: -0.025em;
margin-bottom: 1rem;
position: relative;
}
.cta-section p {
color: var(--muted);
margin-bottom: 2.5rem;
position: relative;
}
.cta-form {
display: flex; flex-direction: column; gap: 1rem;
max-width: 520px; margin: 0 auto;
position: relative;
}
.cta-form textarea {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 8px;
color: var(--text);
font-family: 'DM Sans', sans-serif;
font-size: 0.95rem;
padding: 1rem 1.2rem;
resize: none;
height: 120px;
transition: border-color 0.2s;
outline: none;
}
.cta-form textarea::placeholder { color: var(--muted); }
.cta-form textarea:focus { border-color: rgba(240,165,0,0.4); }
.cta-form input[type=email] {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 8px;
color: var(--text);
font-family: 'DM Sans', sans-serif;
font-size: 0.95rem;
padding: 0.85rem 1.2rem;
outline: none;
transition: border-color 0.2s;
}
.cta-form input[type=email]::placeholder { color: var(--muted); }
.cta-form input[type=email]:focus { border-color: rgba(240,165,0,0.4); }
.cta-form button {
background: var(--accent);
color: #0d0f14;
font-family: 'Syne', sans-serif;
font-weight: 700;
font-size: 1rem;
padding: 1rem;
border: none;
border-radius: 8px;
cursor: pointer;
transition: opacity 0.2s, transform 0.2s;
}
.cta-form button:hover { opacity: 0.88; transform: translateY(-1px); }
.cta-note { font-size: 0.78rem; color: var(--muted); margin-top: 0.5rem; }
.form-feedback {
font-size: 0.9rem;
padding: 0.85rem 1rem;
border-radius: 8px;
text-align: left;
line-height: 1.45;
}
.form-feedback--success {
background: rgba(34, 197, 94, 0.12);
border: 1px solid rgba(34, 197, 94, 0.35);
color: #4ade80;
}
.form-feedback--error {
background: rgba(239, 68, 68, 0.1);
border: 1px solid rgba(239, 68, 68, 0.35);
color: #f87171;
}
.form-honeypot {
position: absolute !important;
left: -9999px !important;
width: 1px !important;
height: 1px !important;
overflow: hidden !important;
clip: rect(0, 0, 0, 0) !important;
white-space: nowrap !important;
}
/* DISPO */
.dispo {
display: inline-flex; align-items: center; gap: 0.5rem;
background: rgba(34,197,94,0.08);
border: 1px solid rgba(34,197,94,0.2);
color: #4ade80;
font-size: 0.78rem; font-weight: 500;
padding: 0.35rem 0.85rem;
border-radius: 100px;
margin-top: 1.5rem;
}
.dispo::before {
content: '';
width: 6px; height: 6px;
background: #4ade80;
border-radius: 50%;
animation: pulse 2s infinite;
}
/* FOOTER */
footer {
border-top: 1px solid var(--border);
padding: 2rem 5%;
display: flex; justify-content: space-between; align-items: center;
font-size: 0.82rem; color: var(--muted);
flex-wrap: wrap; gap: 1rem;
}
.footer-logo { font-family: 'Syne', sans-serif; font-weight: 700; }
.footer-logo span { color: var(--accent); }
footer a[href^="mailto:"] { color: inherit; text-decoration: underline; text-underline-offset: 2px; }
footer a[href^="mailto:"]:hover { color: var(--accent); }
</style>
</head>
<body>
<nav>
<div class="logo">en<span>prod</span>.fr</div>
<button type="button" class="nav-toggle" aria-label="Ouvrir le menu" aria-expanded="false" aria-controls="main-nav">
<span class="nav-toggle-bar" aria-hidden="true"></span>
<span class="nav-toggle-bar" aria-hidden="true"></span>
<span class="nav-toggle-bar" aria-hidden="true"></span>
</button>
<div class="nav-links" id="main-nav">
<a href="tarifs.html">Tarifs</a>
<a href="a-propos.html">À propos</a>
<a href="#contact" class="nav-cta">Décrire mon problème →</a>
</div>
</nav>
<!-- HERO -->
<section class="hero">
<div class="hero-bg"></div>
<div class="grid-overlay"></div>
<div class="hero-content">
<div class="badge">Réponse sous 48h</div>
<h1>Votre prototype est prêt ?<br>Il est temps de <em>passer en prod.</em></h1>
<p class="hero-sub">
Vous avez construit un prototype avec l'IA, ou avez un projet qui tourne en rond depuis des mois — je vous aide à le conclure, le sécuriser et le mettre en production.
</p>
<div class="hero-actions">
<a href="#contact" class="btn-primary">Décrire mon besoin</a>
<a href="#problemes" class="btn-secondary">Voir ce que je résous</a>
</div>
<div class="hero-stats">
<div class="stat-item">
<span class="stat-value">Expert</span>
<span class="stat-label">Technical Leader</span>
</div>
<div class="stat-item">
<span class="stat-value">20+</span>
<span class="stat-label">Années d'expérience</span>
</div>
<div class="stat-item">
<span class="stat-value">100% satisfaction</span>
<span class="stat-label">Résultat garanti</span>
</div>
</div>
<div class="dispo">Disponible — </div>
</div>
</section>
<!-- PROBLÈMES -->
<section id="problemes">
<p class="section-label">Vous vous reconnaissez ?</p>
<h2 class="section-title">Deux situations.<br>Une réponse concrète.</h2>
<p class="section-sub">Que vous ayez buildé avec l'IA ou réalisé un projet avec votre développeur qui n'avance plus — le problème est le même : il faut conclure.</p>
<div style="display:flex; gap: 0.6rem; margin-bottom: 2rem; flex-wrap: wrap;">
<span class="pill-icon" style="background:rgba(240,165,0,0.08); border:1px solid rgba(240,165,0,0.2); color:var(--accent); font-size:0.78rem; font-weight:600; padding:0.3rem 0.9rem; border-radius:100px;"><iconify-icon icon="lucide:sparkles" aria-hidden="true"></iconify-icon> Vous avez buildé avec l'IA</span>
<span class="pill-icon" style="background:rgba(224,92,42,0.08); border:1px solid rgba(224,92,42,0.2); color:var(--accent2); font-size:0.78rem; font-weight:600; padding:0.3rem 0.9rem; border-radius:100px;"><iconify-icon icon="lucide:refresh-cw" aria-hidden="true"></iconify-icon> Votre projet tourne en rond</span>
</div>
<div class="problems-grid">
<div class="problem-card">
<span class="problem-icon" aria-hidden="true"><iconify-icon icon="lucide:bot"></iconify-icon></span>
<p class="problem-tag">MVP IA → Production</p>
<p class="problem-title">Vous avez un MVP généré avec Cursor, Lovable ou Chat GPT — mais il ne tient pas en prod</p>
<p class="problem-desc">Le code fonctionne en démo, mais il n'est ni sécurisé, ni scalable, ni vraiment maîtrisé. J'audite, je structure et je vous emmène jusqu'au déploiement réel.</p>
</div>
<div class="problem-card">
<span class="problem-icon" aria-hidden="true"><iconify-icon icon="lucide:trending-up"></iconify-icon></span>
<p class="problem-tag">Scalabilité</p>
<p class="problem-title">Votre app démo tourne bien — mais elle ne tiendra pas la charge des premiers vrais utilisateurs</p>
<p class="problem-desc">Architecture fragile, base de données non optimisée, infra sous-dimensionnée. J'identifie les points de rupture avant qu'ils ne cassent en production.</p>
</div>
<div class="problem-card">
<span class="problem-icon" aria-hidden="true"><iconify-icon icon="lucide:puzzle"></iconify-icon></span>
<p class="problem-tag">Reprise de code IA</p>
<p class="problem-title">Le code généré par l'IA fonctionne, mais personne ne le comprend vraiment</p>
<p class="problem-desc">Dépendances inutiles, structure chaotique, zero tests. Je reprends la base, documente ce qui doit l'être et vous donne les clés pour l'évolution.</p>
</div>
<div class="problem-card">
<span class="problem-icon problem-icon--accent2" aria-hidden="true"><iconify-icon icon="lucide:refresh-cw"></iconify-icon></span>
<p class="problem-tag">Projet qui tourne en rond</p>
<p class="problem-title">Vous avez un développeur — mais le projet n'avance plus depuis des semaines</p>
<p class="problem-desc">Délais qui glissent, livrables flous, communication difficile. Un regard extérieur expérimenté suffit souvent à débloquer la situation et remettre le projet sur les rails.</p>
</div>
<div class="problem-card">
<span class="problem-icon" aria-hidden="true"><iconify-icon icon="lucide:flag"></iconify-icon></span>
<p class="problem-tag">Closing de projet</p>
<p class="problem-title">Votre projet est à 80% depuis trois mois et personne ne franchit la ligne</p>
<p class="problem-desc">Les derniers 20% sont souvent les plus durs : intégrations, edge cases, déploiement, recette. Je prends en charge cette dernière ligne droite pour vous aider à livrer quelque chose qui tourne vraiment.</p>
</div>
<div class="problem-card" style="background: rgba(240,165,0,0.04); border-left: 2px solid var(--accent);">
<span class="problem-icon problem-icon--soft" aria-hidden="true"><iconify-icon icon="lucide:message-circle"></iconify-icon></span>
<p class="problem-tag">Autre situation ?</p>
<p class="problem-title">Votre situation ne rentre pas exactement dans ces cases</p>
<p class="problem-desc">Décrivez-la en quelques lignes. Si je peux vous aider, je vous le dis franchement — sinon aussi.</p>
</div>
</div>
</section>
<!-- PROCESS -->
<section class="process-section">
<p class="section-label">Comment ça marche</p>
<h2 class="section-title">Simple, direct, efficace.</h2>
<p class="section-sub">Pas de réunions interminables. On va droit au but.</p>
<div class="process-steps">
<div class="step">
<div class="step-num">01</div>
<div class="step-title">Vous décrivez votre problème</div>
<div class="step-desc">En quelques lignes, décrivez vos points de blocage pour que je puisse vous aider. Le formulaire est là pour ça.</div>
</div>
<div class="step">
<div class="step-num">02</div>
<div class="step-title">Je reviens vers vous sous 48h</div>
<div class="step-desc">Un premier retour sur votre situation et une proposition d'échange en visio pour approfondir</div>
</div>
<div class="step">
<div class="step-num">03</div>
<div class="step-title">On travaille ensemble</div>
<div class="step-desc">Accès à votre code, vos outils, vos échanges. J'avance de façon transparente, avec des points réguliers pour que vous restiez dans la boucle.</div>
</div>
<div class="step">
<div class="step-num">04</div>
<div class="step-title">Vous reprenez la main</div>
<div class="step-desc">Avec une solution documentée, testée, et explicable à votre équipe.</div>
</div>
</div>
</section>
<!-- À PROPOS TEASER -->
<div style="padding: 5rem 5%; display: flex; justify-content: space-between; align-items: center; gap: 3rem; flex-wrap: wrap; border-bottom: 1px solid var(--border);">
<div style="display: flex; align-items: center; gap: 2rem; flex-wrap: wrap;">
<div class="about-avatar-icon" style="width:72px; height:72px; border-radius:50%; background:var(--surface); border:1px solid var(--border); display:flex; align-items:center; justify-content:center; flex-shrink:0;" aria-hidden="true"><iconify-icon icon="lucide:user"></iconify-icon></div>
<div>
<p style="font-size:0.75rem; letter-spacing:0.12em; text-transform:uppercase; color:var(--accent); font-weight:600; margin-bottom:0.4rem;">Qui suis-je ?</p>
<p style="font-family:'Syne',sans-serif; font-weight:700; font-size:1.1rem; margin-bottom:0.4rem;">Je suis Christophe Surbier, développeur fullstack freelance depuis plus de 20 ans, passé par des rôles de Technical Leader dans l'industrie musicale.</p>
<p style="font-size:0.88rem; color:var(--muted); max-width:480px;">200+ applications (mobile & web) livrées, responsable technique de HopHopFood — j'aide les entrepreneurs et startups qui ont besoin d'un résultat, pas d'une promesse.</p>
</div>
</div>
<a href="a-propos.html" style="flex-shrink:0; border:1.5px solid var(--border); color:var(--soft); font-size:0.88rem; font-weight:500; padding:0.75rem 1.5rem; border-radius:6px; text-decoration:none; white-space:nowrap; transition:border-color 0.2s, color 0.2s;" onmouseover="this.style.borderColor='var(--accent)';this.style.color='var(--accent)'" onmouseout="this.style.borderColor='var(--border)';this.style.color='var(--soft)'">En savoir plus →</a>
</div>
<!-- TARIFS TEASER -->
<div class="tarifs-teaser">
<div class="tarifs-teaser-left">
<p class="section-label">Tarifs</p>
<h2>Des forfaits <br><em>sans mauvaise surprise.</em></h2>
<p>Pas de régie à l'heure ni de devis flou. Chaque intervention est cadrée à l'avance — avec un premier échange gratuit pour estimer ensemble ce dont vous avez besoin.</p>
<div class="tarifs-pills">
<span class="tarifs-pill">Diagnostic à partir de <strong>350 €</strong></span>
</div>
</div>
<div class="tarifs-teaser-right">
<a href="tarifs.html" class="btn-outline-accent">Voir tous les tarifs →</a>
</div>
</div>
<!-- CONTACT -->
<section class="cta-section" id="contact">
<div class="cta-bg"></div>
<h2>Un besoin ou un problème ?</h2>
<p>Décrivez-le en 2 minutes. Je vous réponds sous 48h.</p>
<form class="cta-form" method="post" action="contact.php" accept-charset="UTF-8">
<div id="form-feedback" class="form-feedback" role="status" hidden></div>
<p class="form-honeypot" aria-hidden="true">
<label for="website">Ne pas remplir ce champ</label>
<input type="text" name="website" id="website" tabindex="-1" autocomplete="off">
</p>
<textarea name="message" id="message" required maxlength="8000" placeholder="Ex : notre app Django plante depuis une mise à jour, on ne sait pas pourquoi. On a environ 500 utilisateurs actifs..."></textarea>
<input type="email" name="email" id="email" required placeholder="Votre adresse email" autocomplete="email">
<button type="submit">Envoyer ma demande →</button>
<p class="cta-note">Réponse garantie sous 48h · Pas d'engagement · Confidentialité assurée</p>
</form>
</section>
<footer>
<div class="footer-logo">en<span>prod</span>.fr</div>
<div>Expert Développeur freelance</div>
<div><a href="mailto:christophe@enprod.fr">christophe@enprod.fr</a></div>
<div>© 2026 · Barcelone</div>
</footer>
<script>
(function () {
var params = new URLSearchParams(window.location.search);
var key = params.get('contact');
if (!key) return;
var fb = document.getElementById('form-feedback');
if (!fb) return;
fb.removeAttribute('hidden');
if (key === 'sent') {
fb.className = 'form-feedback form-feedback--success';
fb.textContent = 'Merci ! Votre message a bien été envoyé. Je vous réponds sous 48h.';
} else if (key === 'invalid') {
fb.className = 'form-feedback form-feedback--error';
fb.textContent = 'Veuillez vérifier votre email et votre message, puis réessayer.';
} else if (key === 'error') {
fb.className = 'form-feedback form-feedback--error';
fb.textContent = 'Envoi impossible pour le moment. Écrivez-moi directement à christophe@enprod.fr.';
}
history.replaceState(null, '', window.location.pathname + window.location.hash);
})();
(function () {
var nav = document.querySelector('nav');
var btn = nav && nav.querySelector('.nav-toggle');
var menu = document.getElementById('main-nav');
if (!nav || !btn || !menu) return;
function setOpen(open) {
nav.classList.toggle('is-open', open);
btn.setAttribute('aria-expanded', open);
btn.setAttribute('aria-label', open ? 'Fermer le menu' : 'Ouvrir le menu');
document.body.style.overflow = open ? 'hidden' : '';
}
btn.addEventListener('click', function () { setOpen(!nav.classList.contains('is-open')); });
menu.querySelectorAll('a').forEach(function (a) {
a.addEventListener('click', function () { setOpen(false); });
});
document.addEventListener('keydown', function (e) {
if (e.key === 'Escape') setOpen(false);
});
})();
</script>
</body>
</html>