Créez, explorez et partagez vos préférences dans un espace accessible et confidentiel.
Découvrir le site · Installation · Fonctionnalités · Confidentialité
Important
Kinklist est destiné à un public adulte et averti. La pratique doit toujours rester consensuelle, sûre et respectueuse des limites physiques et mentales de chacun·e.
| Fonctionnalité | Description | |
|---|---|---|
| 📚 | Deux niveaux de détail | 172 pratiques essentielles en mode Basique, ou 1 014 entrées réparties dans 45 catégories en mode Complet |
| 🎯 | Six niveaux d'intérêt | De « J'adore » à « Hard Limit », avec une forme distincte pour chaque statut |
| Rôles Donne/Reçois | Indiquez si vous donnez, recevez ou alternez pour chaque pratique | |
| 🔎 | Recherche instantanée | Retrouvez rapidement une pratique dans l'ensemble de la liste |
| 🔗 | Partage sécurisé | Créez un lien court contenant vos sélections, vos rôles et les informations renseignées |
| 🖼️ | Export en image | Générez une image haute qualité, lisible et prête à être partagée |
| 💾 | Sauvegarde locale | Retrouvez automatiquement vos préférences dans votre navigateur |
| 📱 | Interface responsive | Utilisable sur mobile, tablette et ordinateur |
La couleur n'est jamais le seul moyen de transmettre une information. Chaque statut possède également une forme géométrique propre :
| Symbole | Statut | Symbole | Statut |
|---|---|---|---|
| ● | J'adore | ■ | J'aime |
| ▲ | Curieux·se | ◆ | Peut-être |
| ✕ | Non merci | ★ | Hard Limit |
| → | Donne | ← | Reçois |
L'application prend également en charge :
- la navigation complète au clavier ;
- les attributs ARIA pour les technologies d'assistance ;
- un focus visible sur chaque contrôle interactif ;
- les préférences
prefers-reduced-motionetprefers-contrast; - des infobulles explicites sur les icônes.
| Touche | Action |
|---|---|
Tab / Maj + Tab |
Naviguer entre les éléments |
Entrée / Espace |
Activer le contrôle sélectionné |
1 à 6 |
Choisir rapidement un statut |
Prérequis : Node.js 18 ou supérieur.
git clone <url-du-depot>
cd Kinklist
npm install
npm startL'application est ensuite disponible sur http://localhost:3000.
Note
Le serveur est nécessaire pour créer et ouvrir les liens courts. Une ouverture directe de index.html en file:// conserve les fonctions locales, mais le partage ne sera pas disponible sans serveur.
docker compose up -dAfficher les commandes Docker utiles
# Voir les journaux
docker compose logs -f
# Reconstruire l'image
docker compose up -d --build
# Vérifier l'état des services
docker compose ps
# Arrêter l'application
docker compose down- Choisissez le mode Basique ou Complet.
- Recherchez une pratique ou parcourez les catégories.
- Sélectionnez un statut, puis précisez éventuellement le rôle Donne ou Reçois.
- Exportez votre liste en image ou créez un lien de partage.
Changer de mode filtre uniquement l'affichage : les statuts et rôles déjà enregistrés restent conservés.
Le bouton Partager envoie les données renseignées au serveur et copie un lien court dans le presse-papier :
https://kink.eldayia.fr/#s/A1b2C3d4E5f6
La personne qui ouvre le lien peut consulter les préférences et choisir de les importer. Aucun lien long de secours n'est généré si l'API est indisponible.
Le bouton Exporter (Image) produit un fichier de moins de 5 Mo, limité à 4 096 px. L'application privilégie le PNG sans perte, puis le WebP haute qualité. Les catégories, libellés et rôles sont dessinés directement pour conserver une bonne lisibilité sur les réseaux sociaux.
| Principe | Mise en œuvre |
|---|---|
| Local par défaut | Les préférences restent dans localStorage tant qu'aucun lien n'est créé |
| Partage volontaire | Seule la création d'un lien envoie les champs renseignés au serveur |
| Expiration | Les partages expirent après 30 jours par défaut |
| Minimisation | Les champs vides et rôles sans sélection associée ne sont pas conservés |
| Aucun pistage | Aucun cookie, compte utilisateur ou outil d'analyse |
| Chiffrement | En production, les données sont chiffrées avec AES-256-GCM |
Caution
Toute personne disposant d'un lien peut consulter les informations qu'il contient. Ne partagez le lien qu'avec des personnes de confiance.
Copiez .env.example vers .env, puis adaptez les valeurs à votre environnement.
| Variable | Description | Valeur par défaut |
|---|---|---|
HOST_PORT |
Port publié sur la machine hôte | 3000 |
NODE_ENV |
Active les protections destinées à la production | production |
SHARE_TTL_DAYS |
Durée de conservation de 1 à 365 jours ; 0 désactive l'expiration |
30 |
ALLOWED_ORIGINS |
Origines CORS supplémentaires, séparées par des virgules | https://kink.eldayia.fr |
STATS_TOKEN |
Jeton Bearer de /api/stats ; la route est désactivée si la valeur est vide |
— |
DATA_ENCRYPTION_KEY |
Secret de 32 caractères minimum, obligatoire en production | — |
DATA_DIR |
Répertoire du stockage JSON | ./data |
TRUST_PROXY |
À activer uniquement derrière un proxy de confiance | false |
Afficher un exemple de configuration
HOST_PORT=3000
NODE_ENV=production
SHARE_TTL_DAYS=30
ALLOWED_ORIGINS=https://kink.eldayia.fr
STATS_TOKEN=remplacez-moi-par-un-secret-long-et-aleatoire
DATA_ENCRYPTION_KEY=remplacez-moi-par-un-autre-secret-long-et-aleatoire
TRUST_PROXY=falseGénérez deux secrets distincts avec openssl rand -hex 32. N'ajoutez jamais .env à Git et conservez DATA_ENCRYPTION_KEY avec vos sauvegardes : les partages chiffrés sont irrécupérables sans cette clé.
Kinklist/
├── index.html Interface HTML sémantique
├── style.css Design responsive et icônes accessibles
├── script.js Logique de l'application
├── kinks-data.js Catalogue des pratiques
├── favicon.svg Identité visuelle
├── server.js Serveur Express et API REST
├── Dockerfile Image de production
├── docker-compose.yml Orchestration et volume persistant
└── data/ Stockage privé des partages
- Interface : HTML5, CSS3 et JavaScript vanilla ES6+
- Persistance locale : Web Storage API
- Export : Canvas API, avec repli vers html2canvas
- Serveur : Node.js 18+ et Express
- Identifiants : nanoid, 12 caractères alphanumériques (~71 bits d'entropie)
- Sécurité : validation stricte, CSP, HSTS, CORS restreint, limitation du débit et AES-256-GCM
- Déploiement : conteneur non-root, système de fichiers en lecture seule et health check
| Méthode | Route | Description |
|---|---|---|
POST |
/api/share |
Crée un partage court |
GET |
/api/share/:id |
Récupère un partage |
GET |
/api/health |
Vérifie l'état du serveur |
GET |
/api/stats |
Retourne les statistiques avec un STATS_TOKEN valide |
Une API privée exposée dans la console du navigateur permet de remplir la liste avec des données reproductibles :
// Remplir la liste avec la graine par défaut
window.__eldaKinkTest.fill()
// Utiliser une graine personnalisée
window.__eldaKinkTest.fill(12345)
// Ajouter également un profil fictif
window.__eldaKinkTest.fill(12345, true)
// Restaurer les données précédentes
window.__eldaKinkTest.restore()Le premier appel à fill() sauvegarde les sélections, rôles et informations personnelles actuels. restore() rétablit cette sauvegarde puis la supprime.
Les contributions sont les bienvenues, notamment pour :
- enrichir ou corriger le catalogue ;
- améliorer l'accessibilité ;
- proposer une fonctionnalité ;
- corriger un dysfonctionnement.
Avant toute modification, veillez à préserver les formes distinctes des statuts, les attributs ARIA et la navigation au clavier.
Ce projet est distribué sous licence MIT.
kink.eldayia.fr