Comprendre SwissKnife
Architecture
Comment SwissKnife est assemblé, servi et déployé.
SwissKnife est un client unique. Il n'y a pas d'API applicative, pas de base de données et pas de service d'authentification.
Navigateur
→ application React
→ images : Canvas 2D
→ audio / vidéo : FFmpeg WASM (un thread, file d'attente)
→ core FFmpeg : /ffmpeg/ffmpeg-core.js et /ffmpeg/ffmpeg-core.wasmEn production Docker :
Nginx non privilégié (port 8080)
→ fichiers statiques issus de dist/
→ repli SPA vers index.html
→ en-têtes COOP / COEP / CSP (SharedArrayBuffer)Stack observée
| Couche | Choix actuel |
|---|---|
| Interface | React 19, TypeScript strict |
| Build | Vite 6, Tailwind CSS 4 |
| Images | API Canvas |
| Audio / vidéo | @ffmpeg/ffmpeg 0.12 et @ffmpeg/core 0.12.6, copie locale |
| Conteneur | Node 20 Alpine pour le build, Nginx unprivileged 1.27 Alpine à l'exécution |
| Contrôles | ESLint, Vitest (npm test), tsc --noEmit |
Deux artefacts distincts
| Artefact | Commande | Usage |
|---|---|---|
| Produit normal | npm run build | Docker, GHCR, npm run dev |
| Démonstration publique | npm run build:demo | projet Vercel de démo uniquement |
Le Dockerfile appelle npm run build. vercel.json du produit appelle npm run build:demo. Les deux ne doivent pas être inversés.
Compose du dépôt
| Fichier | Image |
|---|---|
docker-compose.yml | ghcr.io/lucas-lepajollec/swissknife:latest |
docker-compose.build.yml | construction locale depuis le Dockerfile |
Contrairement à un Compose qui builderait toujours le checkout, l'installation homelab par défaut tire l'image publiée.