diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1521c8b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+dist
diff --git a/generate.py b/generate.py
new file mode 100644
index 0000000..8f73208
--- /dev/null
+++ b/generate.py
@@ -0,0 +1,45 @@
+from pprint import pp
+from pathlib import Path
+import re
+
+src = Path('src')
+views = src.joinpath('views')
+template = views.joinpath('template')
+module = views.joinpath('module')
+
+static = Path('src', 'static')
+
+dist = Path('dist')
+dist.mkdir(exist_ok=True)
+
+for x in dist.rglob('*'):
+    if x.is_file() or x.is_symlink(): x.unlink()
+for x in dist.rglob('*/'): x.rmdir()
+
+def read(file_path):
+    with file_path.open() as html_file:
+        return (file_path.stem, html_file.read())
+
+templates = dict(map(read, template.glob('*.html')))
+modules = dict(map(read, module.glob('*.html')))
+
+def format(item, modules):
+    name, content = item
+
+    return (name, re.sub('\n\s*', '', content.format(**modules)))
+
+dist_html = dict(map(lambda item: format(item, modules), templates.items()))
+
+def mk_dist(dist, item):
+    key, content = item
+    path = dist
+    if key != 'index':
+        path = dist.joinpath(key)
+        path.mkdir(exist_ok=True)
+    with path.joinpath('index.html').open('w') as index:
+        index.write(content)
+
+for item in dist_html.items():
+    mk_dist(dist, item)
+
+dist.joinpath('static').symlink_to(static.resolve(strict=True), target_is_directory=True)
diff --git a/src/views/module/footer.html b/src/views/module/footer.html
new file mode 100644
index 0000000..2dc8561
--- /dev/null
+++ b/src/views/module/footer.html
@@ -0,0 +1,5 @@
+<footer>
+	<p>Website by edpibu - 2021</p>
+	<p>Inspired by IBM Carbon Design System</p>
+	<p>Icons and Pictograms from IBM Carbon Design System</p>
+</footer>
diff --git a/src/views/module/h1.html b/src/views/module/h1.html
new file mode 100644
index 0000000..ba4a0cb
--- /dev/null
+++ b/src/views/module/h1.html
@@ -0,0 +1,6 @@
+<h1>
+	<img src="/static/svg/logo-inv.svg"
+		alt="Logo : goéland avec un bec vert" />
+	Edgar P.
+	<strong>Burkhart</strong>
+</h1>
diff --git a/src/views/module/meta.html b/src/views/module/meta.html
new file mode 100644
index 0000000..33cbb2b
--- /dev/null
+++ b/src/views/module/meta.html
@@ -0,0 +1,13 @@
+<meta charset="utf-8" />
+<meta name="viewport" content="width=device-width,initial-scale=1.0" />
+
+<meta name="author" content="edpibu" />
+<meta name="theme-color" content="#8ac149" />
+<meta name="color-scheme" content="dark light" />
+
+<link rel="icon" type="image/svg+xml" href="/static/svg/logo.svg" />
+<link rel="mask-icon" href="/static/svg/logo.svg" />
+
+<link rel="stylesheet" type="text/css" href="/static/css/main.css" />
+<link rel="stylesheet" type="text/css" href="/static/css/mobile.css"
+	media="screen and (max-width: 42rem)" />
diff --git a/src/cv/index.html b/src/views/template/cv.html
similarity index 78%
rename from src/cv/index.html
rename to src/views/template/cv.html
index bad159c..8dd5b2c 100644
--- a/src/cv/index.html
+++ b/src/views/template/cv.html
@@ -1,29 +1,14 @@
 <!DOCTYPE html>
 <html lang="fr">
 	<head>
-		<meta charset="utf-8" />
-		<meta name="viewport" content="width=device-width,initial-scale=1.0" />
-
 		<title>CV - Edgar P. Burkhart</title>
 		<meta name="description" content="Edgar P. Burkhart, étudiant en génie côtier à l'UPPA. Normalien-élève de l'ENS Paris-Saclay." />
-		<meta name="author" content="edpibu" />
-		<meta name="theme-color" content="#8ac149" />
-		<meta name="color-scheme" content="dark light" />
 
-		<link rel="icon" type="image/svg+xml" href="/static/svg/logo.svg" />
-		<link rel="mask-icon" href="/static/svg/logo.svg" />
-
-		<link rel="stylesheet" type="text/css" href="/static/css/main.css" />
-		<link rel="stylesheet" type="text/css" href="/static/css/mobile.css"
-			media="screen and (max-width: 42rem)" />
+		{meta}
 	</head>
 	<body>
-		<h1>
-			<img src="/static/svg/logo-inv.svg"
-				alt="Logo : goéland avec un bec vert" />
-			Edgar P.
-			<strong>Burkhart</strong>
-		</h1>
+		{h1}
+
 		<nav>
 			<a href="/">
 				edgarpierre.fr
@@ -117,10 +102,6 @@
 			</ul>
 		</div>
 
-		<footer>
-			<p>Website by edpibu - 2021</p>
-			<p>Inspired by IBM Carbon Design System</p>
-			<p>Icons and Pictograms from IBM Carbon Design System</p>
-		</footer>
+		{footer}
 	</body>
 </html>
diff --git a/src/index.html b/src/views/template/index.html
similarity index 65%
rename from src/index.html
rename to src/views/template/index.html
index 43eecbb..73da5cb 100644
--- a/src/index.html
+++ b/src/views/template/index.html
@@ -1,33 +1,19 @@
 <!DOCTYPE html>
 <html lang="fr">
 	<head>
-		<meta charset="utf-8" />
-		<meta name="viewport" content="width=device-width,initial-scale=1.0" />
-
 		<title>Edgar P. Burkhart</title>
 		<meta name="description"
 			content="Edgar P. Burkhart, étudiant en génie côtier à l'UPPA.
 				Normalien-élève de l'ENS Paris-Saclay.
 				Agrégé de Sciences Industrielles de l'Ingénieur." />
-		<meta name="author" content="edpibu" />
-		<meta name="theme-color" content="#8ac149" />
-		<meta name="color-scheme" content="dark light" />
 
-		<link rel="icon" type="image/svg+xml" href="/static/svg/logo.svg" />
-		<link rel="mask-icon" href="/static/svg/logo.svg" />
+		{meta}
 
-		<link rel="stylesheet" type="text/css" href="/static/css/main.css" />
 		<link rel="stylesheet" type="text/css" href="/static/css/index.css" />
-		<link rel="stylesheet" type="text/css" href="/static/css/mobile.css"
-			media="screen and (max-width: 42rem)" />
 	</head>
 	<body>
-		<h1>
-			<img src="/static/svg/logo-inv.svg"
-				alt="Logo : goéland avec un bec vert" />
-			Edgar P.
-			<strong>Burkhart</strong>
-		</h1>
+		{h1}
+
 		<div class="biglinks">
 			<a href="/cv/">
 				<img class="svg" src="/static/picto/rich--text--format.svg" alt="" />
@@ -69,10 +55,6 @@
 			</a>
 		</nav>
 
-		<footer>
-			<p>Website by edpibu - 2021</p>
-			<p>Inspired by IBM Carbon Design System</p>
-			<p>Icons and Pictograms from IBM Carbon Design System</p>
-		</footer>
+		{footer}
 	</body>
 </html>
