Site web à l'adresse manu.quebec.
https://manu.quebec
- HTML 47%
- JavaScript 25.2%
- CSS 24.1%
- Shell 3.7%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
- Remplacer github.sha → forgejo.sha, github.workspace → forgejo.workspace, secrets.GITHUB_TOKEN → secrets.FORGEJO_TOKEN, github.repository → forgejo.repository - Adapter build.sh : GITHUB_SHA → FORGEJO_SHA - Ajouter .forgejo/workflows/update-deps.yml (quotidien 11h UTC, npm-check-updates, PR automatique via API Forgejo) |
||
| .forgejo/workflows | ||
| images | ||
| polices | ||
| test | ||
| .editorconfig | ||
| .gitignore | ||
| .node-version | ||
| .prettierignore | ||
| .prettierrc | ||
| .stylelintrc.json | ||
| apple-touch-icon.png | ||
| build.sh | ||
| eslint.config.js | ||
| favicon.ico | ||
| index.html | ||
| manifest.json | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| robots.txt | ||
| script.js | ||
| sitemap.xml | ||
| style.css | ||
| sw.js | ||
| test-html.js | ||
| theme-init.js | ||
| vitest.config.js | ||
manu.quebec — Libre et fédéré
Site web personnel de Manu — Administrateur système Linux, passionné du Fédivers et du protocole ActivityPub.
Demo : https://manu.quebec
Stack technique
- Site statique HTML/CSS/JS natif (aucun framework)
- Polices : Inter (5 graisses) + JetBrains Mono (2 graisses), auto-hébergées en WOFF2
- Node.js 24 (CI) pour les outils de validation et minification
- PWA : Service Worker avec cache versionné par commit
Structure du projet
index.html → Page unique (lang=fr, OG, Twitter Cards, JSON-LD inline)
style.css → ~1740 lignes, variables CSS, thèmes sombre/clair, animations
theme-init.js → Initialisation immédiate du thème dans le <head> (anti-flash)
script.js → Menu mobile, animations au défilement, modale QR, bascule de
thème, verrou de défilement partagé, pause onglet caché,
enregistrement du Service Worker
sw.js → Service Worker PWA (cache versionné par %%COMMIT_HASH%%)
manifest.json → Manifeste PWA (standalone, theme_color #0A0F1C)
build.sh → Minification + optimisation PNG + injection placeholders
test/ → 4 suites vitest (structure DOM, styles CSS, thème, script)
test-html.js → Validation HTML (vnu W3C ou repli local html-validate)
images/ → Logo, avatar, code QR, icônes PWA 192/512, og-image
polices/ → Inter + JetBrains Mono (WOFF2)
robots.txt → Bloque les bots IA/scraping, autorise le reste
sitemap.xml → Sitemap avec %%BUILD_DATE%% (remplacé à la build)
Développement
Aucune étape de build pour le développement. Ouvrir index.html directement ou servir localement :
npx serve . # serveur local
python3 -m http.server 8000 # alternative
npm install
npm test # 4 couches : html-validate → stylelint → eslint → vitest (42 tests)
Build
En CI, chaque fichier est minifié (terser, clean-css-cli, html-minifier-terser),
les PNG sont optimisés (pngquant lossy puis oxipng lossless, étape best-effort),
et les placeholders %%COMMIT_SOURCE_URL%% / %%COMMIT_HASH%% sont remplacés par
les valeurs du commit. Le résultat est poussé en force-push vers la branche dist.
npm run build # produit dist/ avec statistiques de compression
Fonctionnalités
- CSP : servie par Caddy (en-tête HTTP, pas dans le HTML) —
default-src 'none',script-src 'self'strict,style-src 'self', complétée par HSTS,X-Content-Type-Options: nosniff,Referrer-Policy,Permissions-Policy - PWA : manifest.json + Service Worker (Network First pour HTML, Cache First pour les assets statiques, page hors-ligne de secours)
- Thème clair/sombre : bascule dans la navigation, préférence sauvegardée
(
localStorage), suivi deprefers-color-scheme, init anti-flash dans le<head> - Accessibilité : lien d'évitement,
.sr-only,prefers-reduced-motion, modale QR navigable au clavier avec piège de focus, verrou de défilement partagé, repli sans IntersectionObserver - Open Graph / Twitter Cards :
summary_large_image, localefr_CA - JSON-LD inline : données structurées Schema.org dans le
<head> - Responsive : breakpoints 900px, 768px et 480px
Infrastructure
- Hébergement : VPS chez OVHcloud derrière Caddy (reverse proxy)
- CI/CD : Forgejo Actions — push
main→ tests → build → force-pushdist→ webhook