🇬🇧 English version · 🇫🇷 Version française (cette page)
Skilluv est une plateforme competitive de challenges techniques couvrant quatre domaines : code, design, game et security. Ce depot contient le frontend de l'application, construit avec SvelteKit 2, Svelte 5, Tailwind CSS 4 et TypeScript.
Statut MVP — 2026-07-16 : Livre (v0.3.0). 11 phases FE-M1 → FE-M11 completes. Voir CHANGELOG.md et FEATURE-MATRIX.md pour la couverture backend×frontend. i18n FR + EN (l'arabe a ete retire le 2026-07-16 pour simplifier la maintenance).
Surfaces MVP livrees :
- Parcours talent — onboarding avec choix d'orientations metier, profil avec badges wall (rank chevron, skill patches, medailles, ecussons de guilde, timbres d'evenements), sandbox Monaco, mentorat, opportunites, leaderboards temps reel avec indicateur de saison, wallet avec payouts Stripe Connect + Mobile Money
- Surfaces communaute — feed, forum avec moderation inline pour
forum_moderator, guildes, DM, notifications, tournois, bounties, marche des equipes (rejoindre des slots ouverts), evenements Skilluv (join + timbre) - Surfaces enterprise — landing dediee, tarifs, gestion abonnements, recherche talents, challenges sponsorises, wizard type d'entreprise (direct_hire / staffing_agency / remote_international) avec CRUD agency-clients et config EOR
- Moderation — file curator communaute (
community_curator), file plagiat (plagiarism_reviewer), moderation forum inline - Confidentialite RGPD — export legal + export produit, gestion consentements marketing/analytics, suppression compte avec fenetre soft-delete 30 jours
- PWA — service worker, Web Push VAPID avec forwarding foreground vers toast in-app
- Prerequis
- Installation
- Configuration
- Scripts disponibles
- Architecture du projet
- Routing
- Systeme de themes
- Internationalisation
- Tests
- Deploiement
- Stack technique
- Node.js 22 ou superieur
- npm 10 ou superieur
- Un backend Skilluv en cours d'execution sur le port 3001 (pour le developpement local)
git clone <url-du-depot>
cd skilluv-frontend
npm ciCopier le fichier d'exemple et ajuster les valeurs si necessaire :
cp .env.example .envVariables d'environnement :
| Variable | Description | Valeur par defaut |
|---|---|---|
API_URL |
URL interne du backend (server-side only) | http://localhost:3001/api |
En production, les variables suivantes sont egalement utilisees (voir le Dockerfile) :
| Variable | Description | Valeur par defaut |
|---|---|---|
NODE_ENV |
Environnement d'execution | production |
PORT |
Port d'ecoute du serveur | 3000 |
HOST |
Adresse d'ecoute | 0.0.0.0 |
ORIGIN |
Origine publique du site | https://skilluv.com |
En developpement, Vite proxifie automatiquement les requetes /api et /ws vers http://localhost:3001.
| Commande | Description |
|---|---|
npm run dev |
Lance le serveur de developpement Vite |
npm run build |
Compile l'application pour la production |
npm run preview |
Previsualise le build de production localement |
npm run check |
Verifie les types TypeScript et la syntaxe Svelte |
npm run check:watch |
Idem en mode watch |
npm test |
Execute les tests end-to-end (Playwright) |
npm run test:unit |
Execute les tests unitaires (Vitest) |
npm run test:unit:watch |
Execute les tests unitaires en mode watch |
src/
├── routes/ Routing SvelteKit (file-based)
│
├── lib/
│ ├── api/ Modules client HTTP
│ │ ├── client.ts Client de base avec gestion d'erreurs
│ │ ├── auth.ts Authentification
│ │ ├── challenges.ts Challenges
│ │ ├── profile.ts Profils utilisateurs
│ │ ├── enterprise.ts Fonctionnalites entreprise
│ │ └── ... Autres modules API
│ │
│ ├── stores/ Stores reactifs (Svelte 5 runes)
│ │ ├── auth.svelte.ts Etat d'authentification
│ │ ├── theme.svelte.ts Gestion des themes
│ │ ├── notifications.svelte.ts
│ │ ├── websocket.svelte.ts Evenements temps reel
│ │ └── toast.svelte.ts Notifications toast
│ │
│ ├── components/ Composants reutilisables
│ │ ├── layout/ Navbar, BottomBar
│ │ ├── ui/ Button, Input, Modal, Badge, etc.
│ │ ├── challenge/ ChallengeCard
│ │ ├── sandbox/ Editeur Monaco
│ │ ├── profile/ RankBadge, SkillTree, Heatmap
│ │ ├── leaderboard/ Classements
│ │ └── seo/ JsonLd, Analytics
│ │
│ ├── types/ Definitions TypeScript
│ │ └── index.ts Types Challenge, User, Submission, etc.
│ │
│ ├── i18n/ Internationalisation
│ │ ├── index.ts Classe i18n avec changement de locale
│ │ ├── fr.ts Traductions francaises
│ │ ├── en.ts Traductions anglaises
│ │ └── types.ts Cles typees
│ │
│ └── utils/ Utilitaires
│ └── jsonld.ts Generation de schemas JSON-LD
│
├── app.html Template HTML racine
├── app.css Styles globaux et definitions de themes
├── app.d.ts Declarations de types globaux
└── hooks.server.ts Validation d'authentification server-side
tests/
├── unit/ Tests unitaires (Vitest)
│ ├── setup.ts
│ ├── api-client.test.ts
│ ├── i18n.test.ts
│ ├── jsonld.test.ts
│ └── toast.test.ts
│
└── e2e/ Tests end-to-end (Playwright)
├── auth.test.ts
├── challenges.test.ts
├── i18n.test.ts
└── landing.test.tsLe projet configure les alias suivants dans svelte.config.js :
$components->src/lib/components$stores->src/lib/stores$api->src/lib/api$types->src/lib/types
Le routing est base sur le systeme de fichiers de SvelteKit. Voici les sections principales :
| Route | Description |
|---|---|
/ |
Page d'accueil / Dashboard |
/auth/* |
Authentification (login, register, etc.) |
/challenges |
Liste et detail des challenges |
/challenges/[id]/sandbox |
Editeur de code (sandbox Monaco) |
/challenges/onboarding |
Challenges d'integration |
/community/* |
Challenges communautaires |
/enterprise/* |
Espace entreprise (dashboard, talents) |
/admin/* |
Administration (challenges, users, audit) |
/developer/* |
Outils developpeur (cles API, webhooks) |
/profile/[username] |
Profil public |
/leaderboards |
Classements |
/notifications |
Centre de notifications |
/settings |
Parametres utilisateur |
L'application propose quatre themes sombres, definis dans app.css via des variables CSS :
| Theme | Description |
|---|---|
forge |
Theme par defaut, tons chauds |
neon |
Esthetique cyberpunk, accents neon |
arena |
Ambiance competitive, tons vifs |
terminal |
Style terminal, vert sur fond sombre |
Le theme actif est gere par le store theme.svelte.ts et applique via un attribut data-theme sur l'element racine.
Le projet utilise un systeme i18n maison (pas de bibliotheque tierce). Deux locales sont supportees :
- fr (francais) -- locale par defaut
- en (anglais)
Les traductions sont stockees dans src/lib/i18n/fr.ts et en.ts sous forme d'objets plats avec des cles en notation pointee. L'interpolation de parametres est supportee.
Exemple d'utilisation :
<script>
import { t } from '$lib/i18n';
</script>
<p>{t('challenges.title')}</p>Les tests unitaires utilisent Vitest avec jsdom comme environnement DOM et @testing-library/svelte pour le rendu des composants.
npm run test:unit
npm run test:unit:watchLes tests E2E utilisent Playwright. Ils lancent automatiquement un build de production et le servent sur le port 4173.
npm testConfiguration Playwright :
- Retries : 0 en local, 2 en CI
- Reporter :
listen local,githuben CI
Le projet inclut un Dockerfile multi-stage optimise produisant une image d'environ 50 Mo :
docker build -t skilluv-frontend .
docker run -p 3000:3000 \
-e API_URL=https://api.skilluv.com \
-e ORIGIN=https://skilluv.com \
skilluv-frontendLe conteneur s'execute avec un utilisateur non-root (skilluv) et inclut un healthcheck sur /.
npm run build
node build/index.jsL'adaptateur adapter-node genere un serveur Node.js autonome dans le dossier build/.
| Categorie | Technologie |
|---|---|
| Framework | SvelteKit 2.55 |
| UI | Svelte 5.54 (runes) |
| Langage | TypeScript 5.9 |
| CSS | Tailwind CSS 4.2 |
| Editeur de code | Monaco Editor 0.55 |
| Build | Vite 8 |
| Tests unitaires | Vitest 4.1 |
| Tests E2E | Playwright 1.58 |
| Runtime | Node.js 22 (Alpine) |
| Polices | Space Grotesk, JetBrains Mono |
- Documentation des routes API -- description exhaustive de tous les endpoints backend consommes par le frontend.
Ce projet est distribue sous licence GNU Affero General Public License v3.0 (AGPL-3.0).
Voir CONTRIBUTING.md pour les modalites de contribution. Voir CODE_OF_CONDUCT.md pour les regles de la communaute.
Pour signaler une vulnerabilite, voir SECURITY.md.