diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml
new file mode 100644
index 0000000..51d5199
--- /dev/null
+++ b/.gitea/workflows/deploy.yml
@@ -0,0 +1,46 @@
+name: Build and Deploy Jekyll
+
+on:
+ push:
+ branches:
+ - main
+
+jobs:
+ build:
+ runs-on: native
+ timeout-minutes: 15
+ steps:
+ - name: Checkout
+ env:
+ GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
+ run: |
+ git clone --depth 1 https://alois:${GITEA_TOKEN}@git.alocoq.fr/alois/CoqResearch.git .
+
+ - name: Install Ruby and Jekyll
+ run: |
+ apk add --no-cache ruby ruby-dev ruby-bundler build-base
+ bundle install --path vendor/bundle
+
+ - name: Build
+ run: bundle exec jekyll build
+
+ - name: Install kubectl
+ run: |
+ wget -q https://dl.k8s.io/release/v1.31.0/bin/linux/amd64/kubectl
+ chmod +x kubectl
+ mv kubectl /usr/local/bin/kubectl
+
+ - name: Deploy
+ env:
+ KUBE_TOKEN: ${{ secrets.KUBE_TOKEN }}
+ KUBE_SERVER: ${{ secrets.KUBE_SERVER }}
+ run: |
+ unset KUBERNETES_SERVICE_HOST KUBERNETES_SERVICE_PORT
+ kubectl config set-cluster homelab \
+ --server=${KUBE_SERVER} \
+ --insecure-skip-tls-verify=true
+ kubectl config set-credentials deployer --token=${KUBE_TOKEN}
+ kubectl config set-context homelab --cluster=homelab --user=deployer
+ kubectl config use-context homelab
+ POD=$(kubectl get pods -n research -l app=research-nginx -o jsonpath='{.items[0].metadata.name}')
+ kubectl cp _site/. research/${POD}:/usr/share/nginx/html/
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..977da93
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+_site/
+.sass-cache/
+.jekyll-cache/
+.jekyll-metadata
+vendor/
+.bundle/
+Gemfile.lock
diff --git a/404.html b/404.html
new file mode 100644
index 0000000..f379222
--- /dev/null
+++ b/404.html
@@ -0,0 +1,10 @@
+---
+layout: default
+title: "404 — Page introuvable"
+---
+
+
đź”
+
Page introuvable
+
Cette page n'existe pas ou a été déplacée.
+
Retour Ă l'accueil
+
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..de4e27b
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,4 @@
+source "https://rubygems.org"
+gem "jekyll", "~> 4.3"
+gem "jekyll-seo-tag"
+gem "webrick"
diff --git a/README.md b/README.md
deleted file mode 100644
index e69de29..0000000
diff --git a/_config.yml b/_config.yml
new file mode 100644
index 0000000..30f9cd7
--- /dev/null
+++ b/_config.yml
@@ -0,0 +1,26 @@
+title: "John Doe"
+name: "John Doe"
+position: "PhD Student / Researcher"
+affiliation: "University Name"
+affiliation_link: "https://university.edu"
+email: "john@doe.fr"
+description: "Physicist passionate about electronics and computing"
+baseurl: ""
+url: "https://alocoq.fr"
+github: "johndoe"
+linkedin: ""
+google_scholar: ""
+orcid: ""
+twitter: ""
+markdown: kramdown
+highlighter: rouge
+permalink: /:title/
+collections:
+ news:
+ output: false
+ publications:
+ output: false
+ showcase:
+ output: false
+plugins:
+ - jekyll-seo-tag
diff --git a/_data/navigation.yml b/_data/navigation.yml
new file mode 100644
index 0000000..2da5ac9
--- /dev/null
+++ b/_data/navigation.yml
@@ -0,0 +1,9 @@
+- title: "Accueil"
+ url: "/"
+- title: "Publications"
+ url: "/publications"
+- title: "Projets"
+ url: "/showcase"
+- title: "Blog"
+ url: "https://blog.alocoq.fr"
+ external: true
diff --git a/_data/profile.yml b/_data/profile.yml
new file mode 100644
index 0000000..ee98f0b
--- /dev/null
+++ b/_data/profile.yml
@@ -0,0 +1,16 @@
+bio: >
+ Je suis physicien passionné par l'électronique et l'informatique.
+ Mes travaux portent sur [ton domaine de recherche].
+
+interests:
+ - Physique expérimentale
+ - Électronique
+ - Informatique embarquée
+
+education:
+ - degree: "PhD en Physique"
+ institution: "Université de ..."
+ year: "2020 – présent"
+ - degree: "Master de Physique"
+ institution: "Université de ..."
+ year: "2018 – 2020"
diff --git a/_layouts/default.html b/_layouts/default.html
new file mode 100644
index 0000000..d8bac39
--- /dev/null
+++ b/_layouts/default.html
@@ -0,0 +1,31 @@
+
+
+
+
+
+ {{ page.title | default: site.title }}
+
+
+ {% seo %}
+
+
+
+ {{ content }}
+
+
+
diff --git a/_news/2024-01-01-welcome.md b/_news/2024-01-01-welcome.md
new file mode 100644
index 0000000..212af73
--- /dev/null
+++ b/_news/2024-01-01-welcome.md
@@ -0,0 +1,4 @@
+---
+date: 2024-01-01
+---
+Bienvenue sur mon site !
diff --git a/_publications/2024-paper.md b/_publications/2024-paper.md
new file mode 100644
index 0000000..23040cb
--- /dev/null
+++ b/_publications/2024-paper.md
@@ -0,0 +1,9 @@
+---
+title: "Titre de ta publication"
+authors: "Doe, J., et al."
+venue: "Journal / Conférence"
+year: 2024
+paper_url: ""
+code_url: ""
+selected: true
+---
diff --git a/_showcase/project1.md b/_showcase/project1.md
new file mode 100644
index 0000000..ab4b712
--- /dev/null
+++ b/_showcase/project1.md
@@ -0,0 +1,8 @@
+---
+title: "Mon projet principal"
+description: "Description courte du projet."
+url: "https://blog.alocoq.fr/projets/mon-premier-projet"
+tags:
+ - électronique
+ - python
+---
diff --git a/assets/css/main.css b/assets/css/main.css
new file mode 100644
index 0000000..8b7bc88
--- /dev/null
+++ b/assets/css/main.css
@@ -0,0 +1,68 @@
+:root {
+ --accent: #3050ff;
+ --bg: #ffffff;
+ --text: #1a1a2e;
+ --text-muted: #666;
+ --border: #e5e7eb;
+ --card-bg: #f9fafb;
+ --max-width: 860px;
+}
+@media (prefers-color-scheme: dark) {
+ :root {
+ --bg: #0f0f13;
+ --text: #e8e8f0;
+ --text-muted: #888;
+ --border: #2a2a3a;
+ --card-bg: #16161e;
+ }
+}
+* { box-sizing: border-box; margin: 0; padding: 0; }
+html { font-size: 16px; scroll-behavior: smooth; }
+body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: var(--bg); color: var(--text); line-height: 1.7; }
+a { color: var(--accent); text-decoration: none; }
+a:hover { text-decoration: underline; }
+.navbar { border-bottom: 1px solid var(--border); padding: 0 1.5rem; }
+.nav-inner { max-width: var(--max-width); margin: 0 auto; display: flex; align-items: center; justify-content: space-between; height: 56px; }
+.nav-brand { font-weight: 600; color: var(--text); font-size: 15px; }
+.nav-links { display: flex; gap: 1.5rem; }
+.nav-links a { font-size: 14px; color: var(--text-muted); }
+.nav-links a:hover, .nav-links a.active { color: var(--accent); text-decoration: none; }
+main { max-width: var(--max-width); margin: 0 auto; padding: 2.5rem 1.5rem; }
+footer { border-top: 1px solid var(--border); text-align: center; padding: 1.5rem; font-size: 13px; color: var(--text-muted); margin-top: 4rem; }
+footer a { color: var(--text-muted); }
+.profile { display: grid; grid-template-columns: 160px 1fr; gap: 2.5rem; align-items: start; margin-bottom: 3rem; }
+@media (max-width: 600px) { .profile { grid-template-columns: 1fr; } }
+.profile-photo { width: 140px; height: 140px; border-radius: 50%; object-fit: cover; border: 3px solid var(--border); }
+.profile-photo-placeholder { width: 140px; height: 140px; border-radius: 50%; background: var(--card-bg); border: 3px solid var(--border); display: flex; align-items: center; justify-content: center; font-size: 56px; }
+.profile-name { font-size: 1.6rem; font-weight: 600; margin-bottom: 4px; }
+.profile-position { color: var(--text-muted); font-size: 15px; margin-bottom: 12px; }
+.profile-bio { font-size: 15px; color: var(--text-muted); line-height: 1.7; margin-bottom: 16px; }
+.profile-links { display: flex; gap: 10px; flex-wrap: wrap; }
+.profile-links a { font-size: 13px; background: var(--card-bg); border: 1px solid var(--border); padding: 4px 12px; border-radius: 99px; color: var(--text-muted); }
+.profile-links a:hover { color: var(--accent); border-color: var(--accent); text-decoration: none; }
+.section { margin-bottom: 3rem; }
+.section-title { font-size: 1.1rem; font-weight: 600; margin-bottom: 1rem; padding-bottom: 8px; border-bottom: 2px solid var(--accent); display: inline-block; }
+.news-list { list-style: none; }
+.news-item { display: flex; gap: 1rem; padding: 10px 0; border-bottom: 1px solid var(--border); font-size: 14px; }
+.news-date { color: var(--text-muted); flex-shrink: 0; min-width: 90px; }
+.pub-list { display: flex; flex-direction: column; gap: 1.25rem; }
+.pub-card { background: var(--card-bg); border: 1px solid var(--border); border-radius: 10px; padding: 1rem 1.25rem; }
+.pub-title { font-size: 15px; font-weight: 500; margin-bottom: 4px; }
+.pub-authors { font-size: 13px; color: var(--text-muted); margin-bottom: 4px; }
+.pub-venue { font-size: 13px; color: var(--accent); margin-bottom: 8px; }
+.pub-links { display: flex; gap: 8px; }
+.pub-links a { font-size: 12px; background: var(--bg); border: 1px solid var(--border); padding: 2px 10px; border-radius: 99px; color: var(--text-muted); }
+.pub-links a:hover { color: var(--accent); text-decoration: none; }
+.showcase-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 1rem; }
+.showcase-card { background: var(--card-bg); border: 1px solid var(--border); border-radius: 10px; padding: 1rem; }
+.showcase-card:hover { border-color: var(--accent); }
+.showcase-title { font-size: 15px; font-weight: 500; margin-bottom: 6px; }
+.showcase-desc { font-size: 13px; color: var(--text-muted); line-height: 1.5; margin-bottom: 10px; }
+.showcase-tags { display: flex; flex-wrap: wrap; gap: 4px; }
+.showcase-tag { font-size: 11px; background: var(--bg); border: 1px solid var(--border); padding: 2px 8px; border-radius: 99px; color: var(--text-muted); }
+.interests-list { display: flex; flex-wrap: wrap; gap: 8px; }
+.interest-tag { font-size: 13px; background: var(--card-bg); border: 1px solid var(--border); padding: 4px 14px; border-radius: 99px; color: var(--text-muted); }
+.edu-list { list-style: none; }
+.edu-item { padding: 8px 0; border-bottom: 1px solid var(--border); display: flex; justify-content: space-between; font-size: 14px; }
+.edu-degree { font-weight: 500; }
+.edu-year { color: var(--text-muted); }
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..4e2a3ee
--- /dev/null
+++ b/index.html
@@ -0,0 +1,78 @@
+---
+layout: default
+title: Home
+url: /
+---
+
+
+
+
{{ site.name }}
+
+
{{ site.data.profile.bio }}
+
+ {% if site.email %}
✉ Email{% endif %}
+ {% if site.github %}
GitHub{% endif %}
+ {% if site.linkedin %}
LinkedIn{% endif %}
+ {% if site.google_scholar %}
Google Scholar{% endif %}
+ {% if site.orcid %}
ORCID{% endif %}
+
+
+
+
+
+
Actualités
+
+ {% for item in site.news limit:5 %}
+ -
+ {{ item.date | date: "%b %Y" }}
+ {{ item.content | markdownify | remove: '
' | remove: '
' }}
+
+ {% endfor %}
+
+
+
+
+
Publications sélectionnées
+
+ {% assign selected = site.publications | where: "selected", true %}
+ {% for pub in selected %}
+
+
+
{{ pub.title }}
+
{{ pub.authors }}
+
{{ pub.venue }}, {{ pub.year }}
+
+ {% if pub.paper_url %}
Paper{% endif %}
+ {% if pub.code_url %}
Code{% endif %}
+
+
+
+ {% endfor %}
+
+
+
+
+
Intérêts
+
+ {% for interest in site.data.profile.interests %}
+ {{ interest }}
+ {% endfor %}
+
+
+
+
+
Formation
+
+ {% for edu in site.data.profile.education %}
+ -
+
+
{{ edu.degree }}
+
{{ edu.institution }}
+
+ {{ edu.year }}
+
+ {% endfor %}
+
+
diff --git a/publications.html b/publications.html
new file mode 100644
index 0000000..4b94cdf
--- /dev/null
+++ b/publications.html
@@ -0,0 +1,27 @@
+---
+layout: default
+title: Publications
+url: /publications
+---
+Publications
+
+ {% assign pubs_by_year = site.publications | group_by: "year" | sort: "name" | reverse %}
+ {% for year_group in pubs_by_year %}
+
+
{{ year_group.name }}
+ {% for pub in year_group.items %}
+
+
+
{{ pub.title }}
+
{{ pub.authors }}
+
{{ pub.venue }}
+
+ {% if pub.paper_url %}
Paper{% endif %}
+ {% if pub.code_url %}
Code{% endif %}
+
+
+
+ {% endfor %}
+
+ {% endfor %}
+
diff --git a/showcase.html b/showcase.html
new file mode 100644
index 0000000..40bed62
--- /dev/null
+++ b/showcase.html
@@ -0,0 +1,19 @@
+---
+layout: default
+title: Projets
+url: /showcase
+---
+Projets
+