Stack technique cible selon ces principes stricts :
- ✅ Vanilla pur (ou librairie très simple/maintenable)
- ✅ Modules ES modernes (import/export)
- ✅ Pas de build (déploiement direct)
- ✅ Traitement côté client = aucune données personnelles interceptables (= zéro auth)
- ✅ Monoservice (un seul service par outil)
- ✅ Pas de dépendances (ou minimales si vraiment nécessaire)
- ✅ Architecture aussi simple que possible
- ✅ Pas de tests (simplicité maximale)
- ✅ Pas de CDN (tout en local)
- Frontend : HTML5, CSS3, JavaScript vanilla (ES6+ modules)
- CSS : Design System partagé (
shared/design-system/) - Composants : Composants JavaScript partagés (
shared/components/) si nécessaire - Backend : Aucun (traitement 100% côté client)
- Build : Aucun
- Dépendances : Aucune
- CDN : Aucun (tout en local)
- Tests : Aucun
Principe : Option A par défaut pour tous les outils.
- Frontend : HTML/CSS/JS vanilla + Design System partagé (modules ES6)
- Backend : Node.js simple (http natif) - UNIQUEMENT si traitement serveur absolument requis
- API : REST minimal (http natif Node.js)
- Build : Aucun
- Dépendances : Aucune (http natif Node.js)
- CDN : Aucun
- Tests : Aucun
Principe : Option B uniquement si backend absolument nécessaire (ex: proxy API externe, traitement serveur requis). Sinon, Option A par défaut.
Chemin : tools/instafed/
État actuel :
- ✅ Vanilla JS (
script.js) - ✅ Design System partagé (
../../shared/design-system/) - ✅ Styles locaux (
styles.css+styles/) ⚠️ JSZip via CDN (à remplacer par local)
Fichiers :
index.htmlscript.js(logique principale)styles.css+styles/(base, components, icons, layout)
Action : Option A - Remplacer JSZip CDN par version locale
Effort : Faible (1 jour)
Chemin : tools/feed-minitools/subscription-organizer/
État actuel :
- ✅ Vanilla JS (
analytics.js- modules ES6) - ✅ Design System partagé (
../../../shared/design-system/) - ✅ Composants partagés (
../../../shared/components/) - ✅ Aucune dépendance
- ✅ Aucun backend
Fichiers :
index.htmlanalytics.js(logique principale, modules ES6)styles.css+styles-unified.css
Action : Option A - Aucun changement nécessaire
Effort : Aucun
Chemin : tools/feed-minitools/urls-to-opml/
État actuel :
- ❌ Frontend : Next.js 14 + React + TypeScript (
frontend/) - ❌ Tailwind CSS (npm)
⚠️ Backend : FastAPI Python (backend/main.py- 145 lignes)
Structure actuelle :
frontend/app/page.tsx(composant principal)frontend/components/RSSFeedFinder.tsxbackend/main.py(FastAPI)
Question clé : Le parsing RSS/Atom peut-il être fait côté client ?
Si parsing côté client possible :
- ✅ Option A pure : Frontend vanilla JS, aucun backend
- ✅ Pas de dépendances
- ✅ Traitement 100% côté client (confidentialité)
- ✅ Structure cible :
tools/feed-minitools/urls-to-opml/index.html+app.js
Si parsing serveur absolument nécessaire :
⚠️ Option B : Frontend vanilla + Backend Node.js minimal (http natif)⚠️ Structure cible :tools/feed-minitools/urls-to-opml/index.html+app.js+server.js
Action : Option A par défaut - Évaluer parsing côté client. Option B seulement si parsing serveur absolument nécessaire.
Effort : Moyen (3-5 jours)
Chemin : tools/feed-minitools/favorites-migrator/
État actuel :
- ✅ Frontend vanilla JS (
public/index.html+public/js/) - ✅ Design System partagé (
../../../shared/design-system/) - ✅ Composants partagés (
../../../shared/components/) - ❌ Backend Express avec nombreuses dépendances (7 npm prod + 13 npm dev)
⚠️ Architecture complexe (services, middleware, controllers)
Structure actuelle :
public/index.html(frontend)public/js/(api.js, auth.js, migration.js, ui.js, validation.js)server.js(backend Express)services/,middleware/,controllers/(architecture complexe)
Question clé : L'API Feedbin peut-elle être appelée directement depuis le client ?
Si API Feedbin accessible depuis client :
- ✅ Option A pure : Frontend vanilla JS, aucun backend
- ✅ Structure cible :
tools/feed-minitools/favorites-migrator/index.html+app.js - ✅ Pas de dépendances
- ✅ Traitement 100% côté client (confidentialité)
- ✅ Zéro auth (pas de backend = pas d'interception)
Si API Feedbin nécessite proxy serveur (CORS, clés API) :
⚠️ Option B : Frontend vanilla + Backend Node.js minimal (http natif)⚠️ Structure cible :tools/feed-minitools/favorites-migrator/index.html+app.js+server.js⚠️ Backend minimal pour proxy API uniquement⚠️ Pas d'auth (proxy simple)
Action : Option A par défaut - Évaluer accès direct API Feedbin. Option B seulement si proxy absolument nécessaire.
Effort :
- Option A : Faible (1 jour) - Supprimer backend, adapter appels API, restructurer fichiers
- Option B : Moyen (2-3 jours) - Simplifier backend (http natif), restructurer fichiers
- ✅ instafed :
- Remplacer JSZip CDN → local
- ❌
script.js→ ✅app.js ⚠️ styles/→ ✅styles.css(unifier si possible)
- ✅ subscription-organizer :
- Aucun changement technique
- ❌
styles-unified.css→ ✅styles.css ⚠️ analytics.js→ ✅app.js(ou garder si logique métier spécifique)
Total Phase 1 : 1-2 jours
⚠️ urls-to-opml : Évaluer faisabilité parsing RSS/Atom côté client (JavaScript)⚠️ favorites-migrator : Évaluer accès direct API Feedbin (CORS, clés API)
Total Phase 2 : 1 jour
⚠️ urls-to-opml :- Migration Next.js → vanilla (Option A ou B selon évaluation)
- ❌
frontend/app/page.tsx→ ✅index.html - ❌
frontend/components/→ ✅modules/(si nécessaire) - ❌
backend/main.py→ ✅server.js(si Option B) ou supprimer (si Option A) - Supprimer
frontend/etbackend/(unifier à la racine)
⚠️ favorites-migrator :- Supprimer backend (Option A) ou simplifier (Option B)
- ❌
public/index.html→ ✅index.html(déplacer à la racine) - ❌
public/js/→ ✅modules/ - ❌
public/style-unified.css→ ✅styles.css(supprimer si Design System suffisant) - ❌
data-sources/→ ✅data/(si nécessaire) - Supprimer
public/(déplacer contenu à la racine)
Total Phase 3 : 3-6 jours
- Supprimer fichiers de configuration obsolètes (Option A) :
package.json,package-lock.jsonrequirements.txttsconfig.jsonnext.config.jsjest.config.jsjsdoc.json
- Supprimer dossiers obsolètes :
node_modules/(Option A)tests/(pas de tests)temp-refactoring/(fichiers temporaires)
Total Phase 4 : 0.5 jour
- Phase 1 : 1-2 jours (optimisation + harmonisation nomenclature)
- Phase 2 : 1 jour (évaluation)
- Phase 3 : 3-6 jours (migration + harmonisation nomenclature)
- Phase 4 : 0.5 jour (nettoyage)
- Total : 5.5-9.5 jours de développement
Option A (statique, recommandée) :
tool-name/
├── index.html
├── app.js (modules ES6)
├── modules/ (si nécessaire)
│ ├── module1.js
│ └── module2.js
├── styles.css (optionnel si Design System suffisant)
└── README.md
Option B (avec backend minimal) :
tool-name/
├── index.html
├── app.js (modules ES6)
├── server.js (http natif Node.js, 0 dépendances)
├── modules/ (si nécessaire)
└── README.md
- Design System CSS :
../../shared/design-system/(depuistools/tool-name/)variables.cssbase.csscomponents.cssutilities.css
- Composants JavaScript :
../../shared/components/(depuistools/tool-name/)- Badge, Button, Card, Footer, Form, Grid, Header, List, Loader, Message, Modal, Progress, Tabs
- Assets :
../../shared/assets/(depuistools/tool-name/)favicon.ico,favicon.svg
Note : Pour les outils dans tools/feed-minitools/, utiliser ../../../shared/ au lieu de ../../shared/
- JavaScript ES6+ (modules import/export)
- Design System partagé pour UI (
shared/design-system/) - Composants JavaScript partagés (
shared/components/) si nécessaire - Pas de framework (vanilla pur)
- Pas de CDN (tout en local)
- Pas de dépendances npm/pip
- Pas de build
- Pas de tests
- Commentaires JSDoc pour documentation
- Design System :
../../shared/design-system/ - Composants :
../../shared/components/ - Assets :
../../shared/assets/
Note : Pour tools/feed-minitools/tool-name/, utiliser ../../../shared/ au lieu de ../../shared/
- Node.js (http natif) - 0 dépendances
- Uniquement pour proxy API si absolument requis
- Pas d'auth, pas de sessions (proxy simple)
- Cohérence : Tous les outils suivent les mêmes conventions
- Simplicité : Noms clairs et descriptifs
- Standardisation : Respect des conventions web courantes
Convention : kebab-case (minuscules avec tirets)
Exemples :
- ✅
instafed→instafed(déjà conforme) - ✅
favorites-migrator(déjà conforme) - ✅
subscription-organizer(déjà conforme) - ✅
urls-to-opml(déjà conforme)
Règle : Un seul mot en minuscules, ou plusieurs mots séparés par des tirets.
Convention :
index.html: Page principale (toujours à la racine de l'outil)app.js: Logique JavaScript principale (modules ES6)server.js: Backend Node.js (Option B uniquement)styles.css: Styles locaux (si nécessaire, optionnel si Design System suffisant)README.md: Documentation de l'outil
Exemples de corrections nécessaires :
- ❌
script.js(instafed) → ✅app.js - ❌
style.css→ ✅styles.css - ❌
style-unified.css→ ✅styles.css(unifier) - ❌
styles-unified.css→ ✅styles.css(unifier)
Convention : camelCase.js pour les modules
Structure :
tool-name/
├── app.js (point d'entrée)
├── modules/
│ ├── api.js
│ ├── migration.js
│ ├── validation.js
│ └── ui.js
Exemples de corrections nécessaires :
- ✅
public/js/api.js→ ✅modules/api.js - ✅
public/js/auth.js→ ✅modules/auth.js(si nécessaire) - ✅
analytics.js(subscription-organizer) → ✅app.jsoumodules/analytics.js
Convention : kebab-case.css
Structure :
styles.css: Fichier unique (recommandé)- OU
styles/: Dossier avec fichiers séparés (si vraiment nécessaire)styles/base.cssstyles/components.cssstyles/layout.css
Exemples de corrections nécessaires :
- ❌
style.css→ ✅styles.css - ❌
style-unified.css→ ✅styles.css(unifier) - ❌
styles-unified.css→ ✅styles.css(unifier) - ✅
styles/(instafed) : OK si vraiment nécessaire, sinon unifier enstyles.css
Structure cible :
tool-name/
├── index.html
├── app.js
├── modules/ (optionnel, seulement si nécessaire)
│ ├── module1.js
│ └── module2.js
├── data/ (optionnel, seulement si données statiques nécessaires)
│ └── data.json
├── styles.css (optionnel, seulement si Design System insuffisant)
└── README.md
Corrections nécessaires :
- ❌
public/→ ✅ Supprimer, fichiers à la racine - ❌
public/js/→ ✅modules/ - ❌
data-sources/→ ✅data/ - ❌
styles/(si un seul fichier suffit) → ✅styles.css
Structure cible :
tool-name/
├── index.html
├── app.js
├── server.js
├── modules/ (optionnel)
│ └── module1.js
├── data/ (optionnel)
│ └── data.json
└── README.md
Corrections nécessaires :
- ❌
backend/+frontend/→ ✅ Structure unifiée à la racine - ❌
server.mjs→ ✅server.js
Usage : Modules JavaScript ES6 séparés
Convention : Un fichier par module logique
api.js: Appels APImigration.js: Logique de migrationvalidation.js: Validation des donnéesui.js: Gestion de l'interface utilisateur
Usage : Données statiques (JSON, XML, etc.)
Convention : kebab-case pour les noms de fichiers
data/migration-history.jsondata/subscriptions.xmldata/starred.json
Corrections nécessaires :
- ❌
data-sources/→ ✅data/
Convention : kebab-case.yml ou kebab-case.json
Fichiers standardisés :
coolify.yml: Configuration de déploiement (déjà conforme)config.json: Configuration de l'outil (si nécessaire)config.example.json: Exemple de configuration (si nécessaire)
Fichiers à supprimer (Option A) :
- ❌
package.json(Option A - pas de dépendances) - ❌
package-lock.json(Option A) - ❌
requirements.txt(Option A) - ❌
tsconfig.json(Option A - pas de TypeScript) - ❌
next.config.js(Option A - pas de Next.js)
Convention : camelCase
Exemples :
- ✅
const userEmail = 'user@example.com'; - ✅
function migrateFavorites(data) { ... } - ✅
class FeedbinService { ... }
Constantes : UPPER_SNAKE_CASE
- ✅
const MAX_RETRY_ATTEMPTS = 3; - ✅
const API_BASE_URL = 'https://api.example.com';
-
instafed :
- ❌
script.js→ ✅app.js ⚠️ styles/→ ✅styles.css(unifier si possible)
- ❌
-
subscription-organizer :
⚠️ analytics.js→ ✅app.js(ou garder si logique métier spécifique)- ❌
styles-unified.css→ ✅styles.css
-
favorites-migrator :
- ❌
public/index.html→ ✅index.html(déplacer à la racine) - ❌
public/js/→ ✅modules/ - ❌
public/style-unified.css→ ✅styles.css(supprimer si Design System suffisant)
- ❌
-
urls-to-opml :
- ❌
frontend/app/page.tsx→ ✅index.html - ❌
frontend/components/→ ✅modules/(si nécessaire) - ❌
backend/main.py→ ✅server.js(si Option B) ou supprimer (si Option A)
- ❌
-
favorites-migrator :
- Supprimer
public/(déplacer contenu à la racine) - Créer
modules/(déplacerpublic/js/*.js) - Supprimer
data-sources/→data/(si nécessaire)
- Supprimer
-
urls-to-opml :
- Supprimer
frontend/etbackend/(unifier à la racine) - Créer structure Option A ou B selon évaluation
- Supprimer
-
Supprimer tous les fichiers de configuration inutiles (Option A) :
package.json,package-lock.jsonrequirements.txttsconfig.jsonnext.config.jsjest.config.jsjsdoc.json
-
Supprimer les dossiers obsolètes :
node_modules/(Option A)tests/(pas de tests)temp-refactoring/(fichiers temporaires)
| Élément | Convention | Exemple |
|---|---|---|
| Dossier outil | kebab-case |
favorites-migrator |
| Fichier HTML | kebab-case.html |
index.html |
| Fichier JS principal | app.js |
app.js |
| Fichier JS module | camelCase.js |
api.js, migration.js |
| Fichier CSS | kebab-case.css |
styles.css |
| Fichier JSON | kebab-case.json |
config.json |
| Dossier modules | modules/ |
modules/api.js |
| Dossier données | data/ |
data/subscriptions.json |
| Variable JS | camelCase |
userEmail |
| Constante JS | UPPER_SNAKE_CASE |
MAX_RETRY_ATTEMPTS |
| Classe JS | PascalCase |
FeedbinService |
Après harmonisation :
- ✅ 4 outils en vanilla JS pur
- ✅ 0 dépendances npm/pip (ou minimales si Option B)
- ✅ 0 CDN (tout en local)
- ✅ 0 build (déploiement direct)
- ✅ 0 tests (simplicité maximale)
- ✅ Traitement 100% client (confidentialité maximale, zéro auth)
- ✅ Monoservice (statique si possible, backend minimal si nécessaire)
- ✅ Architecture simple (modules ES6, vanilla pur)
- ✅ Nomenclature harmonisée :
- Tous les fichiers principaux :
index.html,app.js,styles.css - Structure de dossiers cohérente :
modules/,data/(si nécessaire) - Conventions de nommage uniformes (kebab-case pour fichiers/dossiers, camelCase pour JS)
- Suppression des dossiers obsolètes (
public/,frontend/,backend/,tests/, etc.)
- Tous les fichiers principaux :
⚠️ Parsing RSS/Atom côté client : Évaluer faisabilité JavaScript⚠️ API Feedbin accès direct : Évaluer CORS/clés API- ✅ Performance : Améliorée (pas de runtime framework)
- ✅ Maintenance : Améliorée (code plus simple)
- ✅ Confidentialité : Maximale (traitement client)
- ✅ Simplicité : Maximale (pas de dépendances, pas de build)
L'harmonisation vers Option A (HTML/CSS/JS Vanilla) permet d'atteindre tous les objectifs clés :
- Stack ultra-simple et maintenable
- Pas de dépendances externes
- Traitement 100% côté client (confidentialité)
- Zéro auth (pas de backend = pas d'interception)
- Monoservice (statique si possible)
L'effort de migration est modéré (5-7 jours) pour un bénéfice à long terme important.