Oracle3
Oracle3: 예측시장 거래 엔진·MCP 서버
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Comprendre ce que contient un fonds (OPCVM, SICAV, FCP, ETF) : composition, risques, pièges et performances, à partir de données publiques.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Site statique (HTML + CSS + JavaScript, sans framework) qui explique un fonds d'investissement (OPCVM, SICAV, FCP, ETF) : où est investi l'argent, les risques et les pièges, et ce que pourrait devenir un investissement. Double-clique sur index.html. Une connexion Internet est nécessaire pour les fiches des fonds français, qui sont chargées en direct depuis la base GECO de l'AMF. Un fichier ouvert ainsi n'a pas d'adresse de site : il s'affiche en mode gratuit (voir « Deux modes selon l'adresse »).README 전문 보기 ↗
Site statique (HTML + CSS + JavaScript, sans framework) qui explique un fonds d'investissement (OPCVM, SICAV, FCP, ETF) : où est investi l'argent, les risques et les pièges, et ce que pourrait devenir un investissement.
Site en ligne : https://decrypte-ton-fonds.fr/ (Cloudflare Pages, branche main). Copie de secours : https://cleante-f.github.io/decrypte-ton-fonds/ (GitHub Pages),
qui renvoie vers la même page du domaine (REDIRIGER_VERS_DOMAINE = true dans js/mode-site.js, actif depuis le 23/10/2026).
Double-clique sur index.html. Une connexion Internet est nécessaire pour les fiches des fonds français,
qui sont chargées en direct depuis la base GECO de l'AMF. Un fichier ouvert ainsi n'a pas d'adresse de site : il s'affiche
en mode gratuit (voir « Deux modes selon l'adresse »).
| Page | Rôle |
|---|---|
index.html | Accueil : présentation du site, recherche rapide, accès aux trois espaces |
decrypte.html | Décrypte ton fonds : phrase « En bref », puis fiche complète (composition, concentration, risque, pièges, frais) |
performances.html | Performances : graphique interactif (périodes, comparaison avec les marchés ou un autre fonds, performances par année) |
confidentialite.html | Confidentialité : responsables, données transmises à des tiers, stockage dans le navigateur, droits (RGPD), bouton d'effacement. Deux versions du texte selon le mode (voir plus bas) |
mentions-legales.html | Mentions légales : éditeurs, hébergeur, contenus et sources. Deux versions du texte selon le mode |
simulateur.html | Simulateur : projection d'un investissement (scénarios, Monte Carlo, frais, inflation, fiscalité, crises, objectif, comparaison, portefeuille, contexte et risques). Libre et sans compte en mode gratuit ; réservé aux comptes en mode comptes |
alertes-desactivees.html | Alertes désactivées : page où le lien de désinscription des e-mails d'alerte renvoie (réussite, lien expiré ou erreur) ; mode comptes seulement |
connexion.html, compte.html, abonnement.html, cgv.html | Pages de compte (connexion, espace personnel, abonnement, conditions de vente) : elles ne servent qu'en mode comptes |
Le fonds consulté est dans l'adresse (#ISIN) : les onglets et les boutons « Voir le graphique des performances » /
« Décrypter ce fonds » passent d'une page à l'autre sans le perdre. Depuis l'accueil, la recherche est transmise
avec ?q=….
Historique des valeurs liquidatives : les valeurs publiées ne sont pas ajustées des divisions de parts (ex. une part divisée par 10). Le site les repère (variation d'un jour égale à un facteur entier) et corrige l'historique antérieur ; les points isolés aberrants sont lissés. Chaque correction est signalée sous le graphique.
Phrase « En bref » (en tête de fiche, enBref dans js/fiche-auto.js) : l'indice suivi quand le nom en contient
un connu (description fixe de son contenu, variantes et versions ESG signalées) ; sinon la composition calculée (classes
d'actifs arrondies à 5 %, région principale) ; sinon la catégorie AMF ; sinon ce que le nom laisse deviner, présenté
comme tel (« D'après son nom… ») ; sinon la première phrase de l'objectif du DIC. Rien n'est affiché si aucune source ne suffit.
Un seul code sert deux sites. Le navigateur choisit le mode d'après l'adresse de la page (location.hostname) ; la règle est dans
js/mode-site.js, chargé en premier dans le <head> de chaque page (et importé par serveur/acces.js, le contrôle d'accès de Cloudflare).
| Mode | Adresses | Ce que voit le visiteur |
|---|---|---|
| Comptes | celles de la liste HOTES_COMPTES : le domaine decrypte-ton-fonds.fr (et son www), comptes.decrypte-ton-fonds.pages.dev (aperçu Cloudflare) et localhost | Pages de compte, bouton « Se connecter », simulateur réservé aux comptes. Paiement coupé (état actuel) : comptes gratuits ; paiement actif : 3 simulations offertes, puis abonnement (voir « Comptes gratuits ») |
| Gratuit | toute autre adresse : GitHub Pages (cleante-f.github.io), adresse principale de Cloudflare (decrypte-ton-fonds.pages.dev), aperçus par commit (abc123.decrypte-ton-fonds.pages.dev), 127.0.0.1, adresse inconnue, fichier ouvert directement | Même design et même contenu, mais simulateur libre et sans aucune trace de compte |
const HOTES_COMPTES = ["decrypte-ton-fonds.fr", "www.decrypte-ton-fonds.fr", "comptes.decrypte-ton-fonds.pages.dev", "localhost"]; // js/mode-site.js : la seule liste des adresses en mode comptes
modeSite(hote) renvoie "comptes" si l'adresse est dans la liste, sinon "gratuit". Les majuscules, les espaces autour et un point
final sont ignorés (comptes.decrypte-ton-fonds.pages.dev. est bien en mode comptes : sinon il sauterait le contrôle d'accès).hebergeurSite(hote) renvoie "github" pour une adresse en *.github.io, sinon "cloudflare".estPageCompte(chemin) reconnaît les pages connexion, compte, abonnement et cgv, avec ou sans .html : GitHub sert
/decrypte-ton-fonds/connexion.html, Cloudflare sert /connexion.Ce qui change en mode gratuit
location.replace, sans rester dans l'historique) ; leurs scripts ne démarrent pas
(ni session, ni appel à Supabase). Sans JavaScript, elles n'affichent que « Page indisponible » : tout leur contenu est réservé au mode comptes.simulateur.html?sim=…#ISIN s'ouvre normalement sur le fonds (le paramètre sim est ignoré). Le simulateur ne garde rien
dans le navigateur (seules restent les copies de données publiques, décrites sur confidentialite.html).*.supabase.co), ni à challenges.cloudflare.com : js/connexion.js ne charge le contrôle anti-robot Turnstile
qu'en mode comptes.functions/_middleware.js, serveur/acces.js) : il laisse tout passer hors mode comptes
(le mode est lu dans l'adresse de la requête : new URL(requete.url).hostname).confidentialite.html et mentions-legales.html : texte de la version gratuite (aucun compte, aucun cookie, contact par la
page GitHub du site, jamais par une adresse e-mail personnelle) ;
l'hébergeur affiché (GitHub ou Cloudflare) dépend de l'adresse.Marquage dans le HTML : js/mode-site.js pose sur <html> les attributs data-site="gratuit|comptes" et
data-heberge-par="github|cloudflare" avant l'affichage. Un élément se réserve à un mode ou à un hébergeur avec
data-seulement="comptes" ou data-seulement="gratuit", et data-si-hebergeur="github" ou data-si-hebergeur="cloudflare" ; les règles
sont dans css/style.css (bloc « Bascule gratuit / comptes »). Une fois la page lue, js/mode-site.js pose aussi l'attribut hidden sur les
éléments de l'autre mode et de l'autre hébergeur (le mode lecture des navigateurs ignore la feuille de style). Un élément sans marque vaut pour les deux modes. Sans marquage de <html>
(JavaScript désactivé, robots d'indexation), la version gratuite et l'hébergeur GitHub s'affichent.
Limites connues
noindex), et leur code source contient encore des valeurs [[…]] à compléter (cgv.html).Depuis le 23/10/2026, le domaine decrypte-ton-fonds.fr est en mode comptes avec le paiement coupé : créer un compte est gratuit, et il donne
accès au simulateur sans limite, aux simulations enregistrées, à la liste de suivi et aux alertes e-mail. Aucune donnée de paiement n'est demandée
(plus de Stripe, d'abonnement, de CGV ni de « simulations offertes » à l'écran). Le code de l'abonnement reste en place, dormant.
GitHub Pages (cleante-f.github.io) et l'adresse principale decrypte-ton-fonds.pages.dev restent en mode gratuit, sans compte.
Les deux interrupteurs du paiement : ils doivent toujours dire la même chose.
CONFIG_COMPTE.paiementActif dans js/config-compte.js (côté site : textes, pages, contrôle d'accès de Cloudflare). Valeur actuelle : false.reglages_site.paiement_actif dans Supabase (côté base : droit_acces(), fonction de paiement). Valeur actuelle : false.
La base est la même pour le domaine et pour l'aperçu comptes.decrypte-ton-fonds.pages.dev : l'aperçu suit donc le même réglage.Pour changer la base (éditeur SQL de Supabase, ou clé « service role » ; jamais depuis le navigateur) :
update public.reglages_site set paiement_actif = true; -- false pour recouper le paiement
Une table reglages_site absente ou sans ligne vaut « paiement actif » (comme paiement_actif() en SQL).
Texte du site : les éléments data-si-paiement="actif" ou data-si-paiement="coupe" ne s'affichent que dans l'état correspondant
(<html data-paiement="…">, posé par js/mode-site.js) ; confidentialite.html et mentions-legales.html ont les deux versions.
Avant de rallumer le paiement :
connexion.html est déjà prévue en data-si-paiement="actif" ;
vérifier qu'elle est bien envoyée à l'inscription), et que les comptes déjà créés gratuitement acceptent les CGV avant leur premier achat.[[…]] des textes légaux (confidentialite.html, mentions-legales.html, cgv.html, js/config-compte.js).paiementActif à true dans js/config-compte.js ET exécuter la commande SQL ci-dessus, puis publier.À faire par l'utilisateur :
decrypte-ton-fonds.fr relié à Cloudflare Pages : fait.decrypte-ton-fonds.fr ; la clé de site (publique) va dans js/config-compte.js,
la clé secrète dans Supabase → Authentication → Attack Protection (captcha, fournisseur Turnstile). Jamais dans .env.https://decrypte-ton-fonds.fr et Redirect URLs https://decrypte-ton-fonds.fr/**
(en gardant l'aperçu https://comptes.decrypte-ton-fonds.pages.dev/** tant qu'il sert).ORIGINES de .github/workflows/supabase.yml) commencent par https://decrypte-ton-fonds.fr :
la première sert de lien vers le site dans les e-mails et de redirection après une désinscription. Le workflow les applique au prochain envoi
touchant supabase/** ou à un lancement manuel (« Run workflow »).Au lancement payant : ajouter le nouveau domaine à HOTES_COMPTES (la seule liste des adresses en mode comptes), ajouter aussi son adresse
EN PREMIÈRE position de ORIGINES dans .github/workflows/supabase.yml (adresses autorisées à appeler les fonctions Supabase ; la première sert
de lien vers le site dans les e-mails, elle doit donc être en mode comptes), retirer le noindex de cgv.html et abonnement.html
(pages à faire connaître ; connexion.html et compte.html le gardent), puis compléter les valeurs [[…]] des textes légaux
(confidentialite.html, mentions-legales.html, cgv.html, js/config-compte.js). Le contrôle avant publication admet les [[…]] seulement
dans les pages de compte, dans js/config-compte.js et dans les éléments data-seulement="comptes".
Essayer les deux modes en local : servir le site sur un port (par exemple 8771). http://127.0.0.1:8771/ est en mode gratuit,
http://localhost:8771/ en mode comptes. Les tests (node --test "tests/*.test.mjs") vérifient la règle de bascule, le contrôle d'accès,
le marquage des pages et les textes de la version gratuite.
Accessible depuis l'onglet « Simulateur » ou le bouton « Simuler mon investissement » de chaque fiche. L'utilisateur répond à 4 questions (capital de départ, versement régulier, durée, ce qu'il veut simuler), puis ajuste son plan et les options avancées (inflation, frais, fiscalité française, prime de risque des actions). Aucun chiffre n'est présenté comme une prévision : le site montre toujours une fourchette et des scénarios.
js/projection.js) : rendements mensuels du fonds ; avant sa création, historique reconstitué
en appliquant son exposition estimée (analyse des rendements) à des fonds de référence de la base GECO cotés
depuis les années 1990 (AXA Indice USA, AXA Indice Euro, SG Actions US Techno, Covéa Euro Souverain…).
On retrouve ainsi le comportement probable du fonds en 2000-2003, 2008, 2011, 2020 et 2022.scripts/actualiser_contexte.py, lancé chaque matin par GitHub Actions (.github/workflows/contexte.yml), écrit :
data/contexte.js : indicateurs de la BCE (taux, inflation, anticipations, chômage, croissance, dette, change,
stress financier, taux moyen des livrets en France), de la Fed de New York, du Trésor américain et du BLS (prévisions du FMI retirées le 01/10/2026 :
usage commercial soumis à autorisation) et titres d'actualité classés par thème (BCE, Fed, Commission européenne ; flux des médias retirés le 01/10/2026,
leurs conditions excluant l'usage commercial) ;data/references.js : séries des fonds de référence, pour que chaque visiteur n'ait pas à les télécharger.Chaque donnée garde sa date et sa source ; une donnée en retard sur son rythme de publication est signalée. Si une source ne répond pas, le fichier précédent est conservé. Pour lancer une mise à jour à la main : onglet Actions du dépôt GitHub → « Mise à jour des données du simulateur » → Run workflow, ou :
python3 scripts/actualiser_contexte.py
scripts/actualiser_marches.py, lancé juste après par la même tâche, écrit data/marches.js. Il est affiché dans
la fiche (section « 4. Risque ») et dans l'onglet « Contexte & risques » du simulateur (js/marches.js). Le navigateur
n'appelle aucune API : il lit ce fichier du site. Un module par source dans scripts/sources/ (délai maximum 8 s) :
| Bloc | Principale | Secours | Dernier recours | Cache |
|---|---|---|---|---|
| Taux de change (USD, GBP, CHF, JPY, CNY) | BCE, sans clé | Frankfurter (taux BCE), sans clé | Currency-api (fawazahmed0), sans clé | 6 h |
| Marchés (S&P 500, Nasdaq-100, Euro Stoxx 50, Europe hors UEM, Topix, émergents, MSCI World) | Valeurs liquidatives de fonds indiciels (AMF – GECO), sans clé | — (aucune source gratuite n'autorise un site public : Alpha Vantage retiré le 01/10/2026) | Dernière valeur connue | 6 h |
Actualités de 23 grandes entreprises souvent détenues (scripts/sources/entreprises.py) | NewsData.io, clé NEWSDATA_KEY (28 requêtes au plus : 60 par fenêtre, 200 crédits par jour) | — (MarketAux retiré le 01/10/2026 : usage commercial interdit) | — | 6 h |
Les actualités s'affichent sous les principales lignes d'un fonds (fiche, section 2) et dans « Contexte & risques », pour
les entreprises reconnues parmi ses lignes. Filtres : titres générés automatiquement (déclarations de positions,
formulaires SEC, « prévisions » de cours, communiqués d'études de marché) et sites qui en publient surtout ; titres
mal encodés réparés. Sur une réponse 429 (trop de requêtes), le script attend une fois le délai Retry-After.
Si toutes les sources d'un bloc tombent, la dernière valeur connue est gardée avec sa date et un message ; la page n'est jamais cassée. Chaque bloc affiche sa source et l'heure de sa mise à jour.
.env.example) ;
pour un essai local, copier .env.example en .env (ignoré par Git). Une clé absente fait simplement sauter la source.python3 scripts/tests_sources.pypython3 scripts/sonder_api.py affiche la structure réelle de sa réponse
(sans jamais afficher la clé).python3 scripts/actualiser_marches.py --forcer, ou sur GitHub :
Actions → « Mise à jour des données du simulateur » → Run workflow → cocher « Rappeler toutes les API ».| Type de fonds | Nombre | Source | Données disponibles |
|---|---|---|---|
| Fonds de droit français (FCP, SICAV, FCPE, FCPI…) | ≈ 11 400 | AMF – base GECO | Identité, parts, encours, historique sur 10 ans (volatilité, perte maximale, performance), documents officiels, DIC lu automatiquement (SRI, frais, durée, objectif…) et composition calculée (voir ci-dessous), agrément de la société de gestion (liste AMF, data.gouv.fr) |
| ETF étrangers cotés en Europe | ≈ 8 000 (dont ≈ 2 400 américains, signalés comme inaccessibles aux particuliers) | ESMA (registres FIRDS et FITRS) + Xetra, OpenFIGI, BCE, GLEIF, cours Deutsche Börse | Identité officielle (LEI, devise, places de cotation dans l'UE, société de gestion, compartiment, type, tranche d'encours), tickers de toutes les bourses européennes (Euronext, Londres, Suisse, Allemagne…), cours de clôture relevé chaque jour (Xetra), montant échangé en bourse, notification pour la France (registre ESMA), et composition estimée via un fonds français « jumeau » qui suit le même indice |
| Fonds étrangers commercialisés en France | ≈ 13 900 (≈ 8 600 OPCVM et ≈ 5 400 FIA, marqués « réservé » avec l'alerte de leur type : FIA, ELTIF, EuVECA) | AMF – base GECO, + ESMA (FIRDS), BCE, GLEIF, cours Deutsche Börse | Identité ; pour ceux qui sont cotés dans l'UE, ISIN retrouvés par leur LEI ou par le nom (noms des bourses dans FIRDS ou nom officiel GLEIF : correspondance prudente, signalée « à vérifier dans le DIC »), et cours relevé chaque jour à la Bourse de Francfort quand il existe |
| Autres fonds cotés en Europe, absents de la liste de l'AMF | ≈ 2 700 | ESMA (FIRDS), GLEIF, BCE, cours Deutsche Börse | Identité (nom officiel GLEIF, parts regroupées par compartiment grâce au LEI), notification pour la France (registre ESMA), cours quand il existe ; alerte « peut-être pas proposé en France », et alerte plus forte pour les fonds de droit non européen (sans DIC européen) |
| Fonds américains (SEC) | ≈ 19 400 (19 411 au 3e trimestre 2026 : toutes les séries, avec ou sans ticker, sauf les contrats d'assurance, et 709 fonds sans numéro de série désignés par leur CIK : SPY, DIA, MDY, fonds fermés…) | SEC – EDGAR (listes des séries et des parts, jeux de données N-PORT et résumés de prospectus) + BCE (taux de change) | Identité (société de gestion, parts et tickers, actif net et date, LEI), composition des dépôts N-PORT (10 premières lignes, pays, classes d'actif, devises ; positions courtes et produits dérivés écartés des répartitions, ce qui est signalé ; réinvestissement des garanties du prêt de titres écarté aussi), depuis octobre 2019 (taux de change mensuels de la BCE ; performances sur 1, 3 et 5 ans, volatilité et perte maximale, graphique de Performances, simulateur), des résumés de prospectus (frais annuels bruts et nets, frais de gestion, droit d'entrée, frais de sortie différés), comparaison des parts du fonds. Pas de DIC : la fiche renvoie aux documents officiels du fonds (prospectus) et à EDGAR. Les fonds de l'annuaire européen qui ont le même LEI qu'une série américaine (≈ 2 200 ISIN) gagnent aussi composition, frais et rendements SEC |
Aucune analyse toute faite n'est reprise : on part de données brutes publiques et on calcule nous-mêmes.
Moteur 1 — lecture de l'inventaire (js/inventaire.js)
Les fonds français publient dans leur rapport annuel (déposé dans GECO) la liste de toutes leurs positions.
Le site télécharge le PDF, reconstitue les lignes à partir de la position du texte, puis calcule :
top 10, poids de chaque ligne, classes d'actifs, devises, secteurs (quand le rapport les indique) et pays
(code ISIN de chaque ligne, rubriques par pays, tableau réglementaire « ventilation par pays », ou à défaut
devise de cotation de chaque ligne — signalé comme tel).
Il repère aussi les swaps (réplication synthétique), les fonds de fonds et les fonds nourriciers.
Quand une ligne est elle-même un fonds référencé dans l'annuaire (retrouvé par son ISIN, ou par son nom une fois
abréviations et mentions de part retirées), son nom devient un lien, ouvert dans un nouvel onglet :
vers sa fiche sur ce site si elle est bien fournie (fonds français suivi par l'AMF, ou ETF dont l'indice est reconnu),
sinon vers sa page officielle (fiche AMF pour un fonds étranger commercialisé en France, page Euronext ou Deutsche Börse
pour un ETF). Dans le doute (nom abrégé, part couverte ou non, fonds introuvable), aucun lien n'est proposé.
Les rapports des SICAV à compartiments sont découpés en blocs ; on garde celui qui porte le nom du fonds.
Moteur 2 — analyse des rendements (js/style.js)
On cherche le mélange de références qui reproduit le mieux les variations hebdomadaires du fonds sur 3 ans
(régression sous contraintes : poids positifs, total 100 %). Références : fonds indiciels français (valeurs
liquidatives GECO) et indices obligataires et monétaire construits à partir des taux de la BCE, plus une couche
« dollar » qui révèle une éventuelle couverture de change. Le R² indique la fiabilité.
Ce moteur donne l'exposition réelle même quand le fonds passe par des swaps ou par d'autres fonds.
Fonds étrangers (ETF irlandais, luxembourgeois…) : on cherche dans GECO un fonds français qui suit le même indice (« fonds jumeau ») et on applique les deux moteurs à ce jumeau.
js/composition.js choisit la meilleure source et prépare les alertes de concentration. Garde-fou : si l'inventaire
trouvé contredit nettement les rendements (par exemple 0 % d'actions pour un fonds qui se comporte comme un fonds
actions), c'est sans doute celui d'un autre compartiment : il est écarté au profit de l'analyse des rendements.
Les résultats sont gardés une semaine dans le navigateur (la lecture d'un gros rapport peut prendre du temps).
Limites connues
python3 scripts/construire_annuaire.py
Ce script régénère data/annuaire.js (environ 3,5 Mo), data/resume.js et data/firds.js (identité ESMA des fonds
étrangers). Il n'utilise que Python, sans rien à installer, et dure environ une heure (OpenFIGI limite les requêtes sans clé ; il cherche les symboles
de tous les ETF sur les bourses européennes : Euronext, Londres, Suisse, Allemagne, Vienne, Madrid, pays nordiques, Varsovie, Prague, Budapest).
Les fonds étrangers commercialisés en France sont tous repris de GECO : les OPCVM, et les FIA (réservés aux investisseurs professionnels), marqués « réservé »
avec leur type (FIA, ELTIF, EuVECA, EuSEF) et l'alerte qui va avec.
Une mise à jour par mois suffit. Ensuite :
python3 scripts/construire_identite.py
régénère data/identite.js et data/societes.js (environ 10 minutes). identite.js : société de gestion, type de fonds et tranche
d'encours (liste des fonds de la BCE), fonds parapluie et fonds maître (GLEIF), montant moyen échangé en bourse (ESMA FITRS) et
notification pour la France (registre de la commercialisation transfrontière des OPCVM et FIA de l'ESMA : 2 048 OPCVM (UCITS) actifs
notifiés au 07/10/2026, dont 308 fonds hors liste de l'AMF et 612 ETF). societes.js : la liste des sociétés de gestion de portefeuille agréées
par l'AMF (data.gouv.fr, Licence Ouverte 2.0 : 667 sociétés, environ 96 % des fonds français rattachés à leur agrément).
La tâche identite.yml les relance le 20 de chaque mois.
Registre de l'ESMA (fonds européens hors France). Le même script lit en entier le registre de la commercialisation transfrontière des
OPCVM et FIA (fiches actives, environ 6 requêtes ; fonctions pures dans scripts/registres_ue.py, testées par python3 tests/test_registres_ue.py) et ajoute :
data/identite.js : IDENTITE.autorites (pays → nom de l'autorité de contrôle, le plus fréquent parmi les OPCVM de ce pays) et IDENTITE.esmaFonds
(LEI, ou N<numéro> pour un fonds GECO sans ISIN rapproché par son nom et son pays → [société de gestion (index dans noms), pays de l'autorité, cadre, pays de commercialisation]) ;
notifFR est calculé à partir du même registre ;data/annuaire-registres-ue.js : la zone « registres-ue » (fonds européens absents du reste de l'annuaire, de tous les pays sauf la France, dont GECO a déjà tous les fonds ;
clé R<numéro de la fiche ESMA>),
chargée à la première recherche par nom ou à l'ouverture d'un fonds R (js/zones.js) ;data/registres-ue-infos.js : pour chaque fonds R, LEI, pays de l'autorité, pays de commercialisation, politique et tranche d'encours (BCE), fonds parapluie (GLEIF),
chargé à l'ouverture de sa fiche (js/app.js). Si ce fichier ne se charge pas, la fiche garde l'identité de l'annuaire et signale « informations du registre ESMA indisponibles ».La CSSF (Luxembourg) n'est jamais interrogée : ses conditions interdisent toute reproduction sans autorisation écrite (demande préparée, pas encore reçue), rien n'en est repris.
La banque centrale d'Irlande : un lien seulement (« Vérifier l'agrément sur le registre de la Banque centrale d'Irlande », https://registers.centralbank.ie/) sur la fiche des fonds
domiciliés en Irlande, sans reprise de données (registre en PDF illisible de façon fiable, sans ISIN ni LEI).
Pour finir, python3 scripts/tests_annuaire.py (quelques secondes, sans réseau) vérifie qu'aucun ISIN de fonds français
n'a été rattaché par erreur à un autre fonds.
python3 scripts/construire_etats_unis.py # nouveau trimestre seulement (comme la tâche mensuelle)
python3 scripts/construire_etats_unis.py --complet # tout recalculer depuis le 4e trimestre 2019 (long)
python3 scripts/construire_etats_unis.py --forcer # même sans nouveau trimestre (annuaire, frais, correspondances ISIN)
Ce script (bibliothèque standard Python, sans rien à installer) lit les fichiers publics de la SEC et les taux de change mensuels de la BCE, et écrit :
data/annuaire-etats-unis.js (la zone « États-Unis » de l'annuaire : une ligne par série, au format de data/annuaire.js), data/etats-unis/00.js … 63.js
(les détails de chaque série, répartis en 64 fichiers d'après le numéro de série % 64) et data/etats-unis-isin.js (ISIN des fonds européens qui sont aussi une série américaine, retrouvés par leur LEI).
La zone reprend toutes les séries de la liste annuelle de la SEC, avec ou sans ticker, sauf les comptes séparés des contrats d'assurance (types d'entité 32 et 33 : rentes variables,
assurance-vie), et toutes les séries qui ont déposé un rapport N-PORT. Les fonds qui déposent leurs rapports N-PORT sans numéro de série (ETF organisés en « unit investment trust »
comme SPY, DIA ou MDY, fonds fermés, fonds « à intervalles » : 708 au 3e trimestre 2026) sont rangés sous une pseudo-série S + (900 000 000 + CIK du déposant), lue dans
REGISTRANT.tsv, avec le ticker de company_tickers.json ; le site affiche « CIK 884394 (SEC) » et renvoie à EDGAR par le CIK. Les numéros factices (S000000000, C000000000)
sont traités comme absents.
Les rendements et les montants sont convertis en euros par le script ; le navigateur ne contacte jamais la SEC (les fichiers sont hébergés avec le site, et chargés à la demande par js/zones.js et js/etats-unis.js).
La tâche .github/workflows/etats-unis.yml passe le 12 de chaque mois et ne fait rien (« Rien de nouveau ») tant que la SEC n'a pas publié un nouveau trimestre.
Le premier calcul, ou un recalcul complet, se lance à la main : onglet Actions du dépôt GitHub → « Fonds américains (SEC) » → Run workflow, en cochant complet
(une à plusieurs dizaines de minutes : les archives N-PORT font 400 à 500 Mo chacune, lues par plages d'octets sans les télécharger en entier).
Les données représentent 20 à 25 Mo réécrits à chaque trimestre.
Un lancement « complet » peut durer longtemps (le workflow s'arrête au bout de 90 minutes) et partage le groupe de concurrence donnees-simulateur avec les tâches
quotidiennes (contexte.yml à 5 h 23 UTC, cours.yml à 5 h 41 et 13 h 41 UTC) et avec les tâches mensuelles de l'identité (le 20, 6 h 17 UTC), des fonds américains (le 12, 5 h 37 UTC) et des alternatives (le 25, 6 h 47 UTC).
GitHub n'y garde qu'une seule tâche en attente : une tâche quotidienne qui attendrait derrière un lancement complet pourrait être remplacée et sautée.
Lance-le donc en dehors de ces heures : après 15 h 45, heure de Paris (le dernier relevé des cours part à 13 h 41 UTC, soit 15 h 41 en été), et ni le 12, ni le 20, ni le 25 du mois.
Le tableau de prêt de titres de N-PORT (SECURITIES_LENDING.tsv) sert à retirer des répartitions et du top 10 les positions qui réinvestissent des garanties reçues en espèces
(par exemple un fonds monétaire « Invesco Private Prime Fund » dans un fonds d'actions) : ce n'est ni une exposition ni un produit dérivé, mais un placement de l'argent du prêt,
déjà compté dans l'actif net en plus des titres prêtés. Sans ce retrait, la somme des classes dépassait 100 % et la note « effet de levier » s'affichait à tort.
Quand une part seulement d'une position réinvestit des garanties, seule cette part est retirée. Le résumé imprimé par le script compte ces positions à part des dérivés.
Règles de la SEC respectées (sec.gov, « Website Dissemination ») : requêtes identifiées par un User-Agent qui nomme le site et donne un contact, au plus 5 requêtes par seconde (limite de la SEC : 10), aucun logo ni aucune image de la SEC. Les données de la SEC peuvent contenir des erreurs : chaque fiche cite « Source : SEC – EDGAR (…) · données du … », précise « converti en euros (taux BCE) » et rappelle de vérifier les documents officiels du fonds.
scripts/actualiser_cours.py relève chaque jour le cours de clôture des fonds étrangers de l'annuaire : enchère de clôture
de Xetra, sinon dernier cours de la Bourse de Francfort (en euros). Source : les données différées que Deutsche Börse publie
gratuitement 15 minutes après chaque transaction (MiFIR art. 13, https://mfs.deutsche-boerse.com). Leur licence est gratuite
tant que les données ne sont ni revendues ni intégrées à un service payant (conditions acceptées le 01/10/2026).
Le fichier quotidien ne reste en ligne qu'un jour : l'historique se construit jour après jour dans data/cours/AAAA/NN.json
(32 fichiers par an, lus par js/cours.js). La tâche cours.yml passe deux fois par jour.
Sources et droits de réutilisation (vérifiés le 01/10/2026) :
| Source | Usage commercial | Décision |
|---|---|---|
| MarketAux | Interdit (usage non commercial) | Retirée |
| FMI (World Economic Outlook) | Sur autorisation ([email protected]), téléchargement automatique interdit sans accord | Retirée du contexte et du simulateur |
| Flux RSS des médias (Le Monde, Franceinfo, France 24, RFI, Le Figaro, BBC, New York Times, The Guardian) | Usage personnel, ou autorisation requise | Retirés ; seuls restent les communiqués de la BCE, de la Fed et de la Commission européenne |
| NewsData.io | Autorisé (« personal or commercial purposes », dans le respect du droit d'auteur) | Gardé |
| Currency-api (fawazahmed0) | Licence CC0 | Gardé |
| AMF (base GECO) | « Toute utilisation à des fins commerciales ou publicitaires est exclue », sauf accord | Demande d'autorisation à envoyer avant d'ouvrir l'abonnement (formulaire « Nous contacter ») |
| Deutsche Börse (cours différés, fiches gratuites) | Gratuit hors revente | Demande de confirmation envoyée à [email protected] |
| BCE, ESMA, GLEIF, OpenFIGI, BLS, Trésor et Fed de New York | Autorisé (en citant la source) | Gardés |
| SEC (EDGAR : listes des fonds, N-PORT, résumés de prospectus) | Autorisé : « Information presented on sec.gov is considered public information and may be copied or further distributed by users of the web site without the SEC's permission. » Conditions : pas de sceau, de logo ni d'image de la SEC ; au plus 10 requêtes par seconde (5 ici) ; requêtes identifiées par un User-Agent (les robots « non classés » sont refusés) ; données parfois erronées, à vérifier dans les dépôts complets | Gardée, citée « Source : SEC – EDGAR », sans logo |
| Source | Usage sur le site | Condition | Décision |
|---|---|---|---|
| ESMA – registre de la commercialisation transfrontière des OPCVM et FIA | Lu en entier (fiches actives). Notification pour la France (un FIA notifié ne peut être proposé qu'aux investisseurs professionnels) : ligne « Commercialisation en France » sur la fiche des ETF et des fonds étrangers absents de la liste de l'AMF ; pour ces derniers, l'information « Notifié… » (section 5) remplace l'alerte « absent de la liste ». Affirmation positive seulement : un fonds absent du registre n'est pas déclaré « non commercialisé ». Autorité de contrôle, pays de commercialisation et type de chaque fonds européen rapproché ; fonds irlandais et luxembourgeois absents du site (zone « registres-ue », fiche sans ISIN). Cité « ESMA – registre de la commercialisation transfrontière des OPCVM et FIA (réutilisation autorisée en citant la source) » | Reproduction autorisée en citant la source (comme FIRDS et FITRS) | Retenue |
| CSSF (Luxembourg) – recherche d'entités | Aucun : « Aucune reproduction ou diffusion des informations reprises sur ce site n'est permise sans l'autorisation écrite préalable de la CSSF » | Autorisation écrite requise (demande préparée en brouillon, envoyée par l'utilisateur) | Écartée tant que la CSSF n'a pas répondu : jamais interrogée, rien repris |
| Banque centrale d'Irlande – registres des fonds | Un lien « Vérifier l'agrément » sur la fiche des fonds domiciliés en Irlande, sans reprise de données | Réutilisation libre (CC BY 4.0), mais registre en PDF de 127 pages aux colonnes mêlées, sans ISIN ni LEI : illisible de façon fiable | Lien seulement (registers.centralbank.ie est dans LIENS_SEULEMENT de verifier.py) |
| AMF – liste des sociétés de gestion de portefeuille agréées (data.gouv.fr) | « Agréée par l'AMF : n° …, depuis le … » et lien vers le site de la société (en https quand il répond ; aucun lien vers les sites HSBC, faute d'accord écrit), sur la fiche des fonds français dont la société est dans la liste (data/societes.js) | Licence Ouverte 2.0 : citer la source et la date de publication | Retenue |
| BCE – taux moyen des livrets d'épargne en France (statistique compilée par la Banque de France) | Indicateur livrets_fr (Contexte & risques), repère « livret au taux moyen actuel » dans le simulateur, référence « Livrets d'épargne » dans Performances (le dernier taux publié est prolongé jour par jour jusqu'à la dernière valeur du fonds) | Réutilisation libre en citant la BCE | Retenue |
| Webstat (Banque de France) |
La section 6 de la fiche (« Alternative moins chère ») propose, pour un fonds qui suit un indice, des fonds de droit français suivant le même indice avec des frais plus bas, et chiffre l'écart (frais courants, effet sur 10 ans). Pour un fonds à gestion active, quand sa composition permet de choisir un indice (actions à 80 % ou plus et une zone dominante, ou MSCI World), elle affiche « Alternative indicielle (pas le même fonds) » : jusqu'à 3 fonds indiciels, avec la précision qu'ils suivent un marché et non la stratégie du gérant. Sinon (fonds mixte, obligataire, zone peu claire), elle dit qu'il n'existe pas d'alternative indicielle comparable.
.github/workflows/alternatives.yml (le 25 de chaque mois) lance node scripts/construire_alternatives.mjs,
qui réécrit data/alternatives.js, puis node scripts/construire_pages.mjs (pages des fonds, qui reprennent ces frais).
Si moins de la moitié des candidats est lisible, l'ancien fichier est conservé.
Sont exclus les fonds de HSBC Asset Management (données interdites sans accord écrit) et les FCPE.extraireDic de js/geco.js et pdf.js
(js/vendor/pdfjs/), qui lisent déjà les DIC dans le navigateur ; les réécrire en Python (bibliothèque standard seule) serait fragile.isEvalSupported: false (faille CVE-2024-4367, exécution de code via une police de PDF), testé par tests/pdf-securite.test.mjs.Le site est une application à une seule page par outil : Google ne voit pas les fiches ouvertes par #ISIN. Des pages fixes,
générées par scripts/construire_pages.mjs, donnent donc à chaque fonds une adresse que Google peut indexer.
fonds/<nom>-<ISIN>.html.scripts/lecture_dic.mjs, pdf.js) : le DIC de la part (par ISIN) est lu en premier, puis les documents du fonds..github/workflows/resumes.yml, chaque lundi à 01 h 13 UTC (bien avant la tâche quotidienne des données,
avec qui elle partage sa file d'attente). node scripts/construire_resumes.mjs --minutes 110 lit 2 500 fonds au plus par lancement
(les jamais essayés d'abord, puis les essais les plus anciens) et écrit data/resumes.js ; passé 110 minutes, la lecture s'arrête
et ce qui a été lu est enregistré (après le garde-fou), au lieu de tout perdre à la limite de 150 minutes de la tâche.
node scripts/construire_pages.mjs régénère ensuite fonds/, classements/ et les sitemaps. Le premier remplissage demande donc
plusieurs lundis (ou plusieurs lancements manuels).main qui modifie data/annuaire.js,
data/alternatives.js, decrypte.html, js/adresses.js, js/geco.js, js/style.js ou scripts/construire_pages.mjs ;
elle ne fait alors que construire_pages.mjs (1 à 2 secondes, sans réseau) et enregistre les pages si elles ont changé.
Les envois faits par une tâche GitHub ne relancent pas d'autre tâche : alternatives.yml reconstruit donc lui-même les pages.À faire par l'utilisateur (gratuit) :
decrypte-ton-fonds → Domaines personnalisés : ajouter decrypte-ton-fonds.fr et www.decrypte-ton-fonds.fr ;
puis, sur le domaine, Règles → modèle « Redirect from WWW to root ».decrypte-ton-fonds.fr, vérifiée par un enregistrement TXT chez Cloudflare (sans toucher aux TXT de Brevo) ;
puis soumettre https://decrypte-ton-fonds.fr/sitemap.xml (menu « Sitemaps »). L'indexation prend ensuite plusieurs semaines.REDIRIGER_VERS_DOMAINE à true dans js/mode-site.js (GitHub Pages renvoie vers le domaine).Une personne connectée peut suivre jusqu'à 30 fonds et recevoir un e-mail quand l'un d'eux change. Tout est décrit dans la version « comptes »
de confidentialite.html.
Tables Supabase (migration supabase/migrations/20261022000000_suivi_alertes.sql) :
fonds_suivis : les fonds suivis par chaque personne (code du fonds, date d'ajout). Limite de 30 par personne, vérifiée par la base ;preferences_alertes : l'interrupteur, les types d'alerte (nouveau DIC, frais, risque), le seuil de baisse (5, 10 ou 20 %) et les réglages de la fiche ;etat_fonds_suivis : le dernier état public de chaque fonds suivi (date du DIC, frais, SRI, valeur, historique récent). Pas de données personnelles ;
seule la tâche quotidienne la lit et l'écrit (clé « service »).Les deux premières tables sont effacées avec le compte (cascade). Le navigateur ne voit que ses propres lignes.
Dans le site : le bouton « ☆ Suivre ce fonds » est sur la fiche (js/fiche-auto.js, js/app.js). « Mon compte » a une section « Mes fonds suivis »
(retirer un fonds) et une section « Alertes par e-mail » (interrupteur, types, seuil). Au premier suivi, un message près du bouton dit que
l'e-mail d'alerte est activé (avec un lien « Désactiver les alertes » vers compte.html), ou qu'il est coupé et où le réactiver.
La tâche quotidienne : .github/workflows/alertes.yml lance scripts/alertes.mjs chaque jour à 6 h 20 UTC (après le relevé des cours).
Pour chaque fonds suivi, elle lit :
data/cours/ ;data/etats-unis/).Elle compare avec l'état de la veille, puis envoie au plus un e-mail par personne et par jour (API Brevo), qui regroupe ses alertes. L'adresse e-mail est lue dans le compte au moment de l'envoi, pour les seules personnes qui ont une alerte. Au premier passage d'un fonds, rien n'est envoyé : on enregistre seulement son état. Rien n'est écrit dans le dépôt.
En cas d'échec : si GECO est en maintenance (HTTP 418) ou si le quota de Brevo est dépassé, rien n'est envoyé (ou l'envoi s'arrête), l'état n'est pas modifié, et les alertes repartent au passage suivant. Une adresse refusée par Brevo est simplement sautée.
Désinscription : chaque e-mail contient un lien signé, valable 60 jours. Il appelle la fonction Supabase alertes-desinscription
(supabase/functions/alertes-desinscription/), qui coupe les alertes du compte puis renvoie vers alertes-desactivees.html.
Les personnes les réactivent dans « Mon compte ».
Secrets à créer par toi (GitHub : Settings → Secrets and variables → Actions) :
SUPABASE_SERVICE_ROLE_KEY : clé « service » de Supabase (jamais dans le code) ;BREVO_API_KEY : clé de l'API Brevo ;ALERTES_SECRET : un texte secret long et aléatoire, qui signe les liens de désinscription. Il est recopié dans Supabase par
supabase.yml au prochain lancement de ce workflow.Sans ces secrets, la tâche s'arrête avec un avertissement et n'envoie rien.
À faire par toi, avant le premier envoi :
ALERTES_SECRET sur GitHub, puis lancer une fois le workflow supabase.yml (il le recopie dans Supabase) ;sendibt2.com / sendibt3.com) ;
confidentialite.html (version comptes) le dit. À couper si l'offre change, puis mettre la page à jour ;Limites à connaître :
Mode gratuit (GitHub Pages, adresse principale de Cloudflare) : pas de compte, pas de cookie, pas de mesure d'audience.
Le navigateur des visiteurs ne contacte que l'hébergeur (GitHub ou Cloudflare), l'AMF (GECO) et la BCE ; tout le reste est
récupéré par la tâche quotidienne. Stockage local (localStorage) :
nettoyerStockage dans js/outils.js).Mode comptes (aperçu, localhost) : en plus, un cookie dtf_session et la session compte-session-v1 pour les visiteurs connectés ;
le navigateur contacte aussi Supabase (comptes, simulations enregistrées), Stripe (paiement) et, sur la page de connexion, Cloudflare
Turnstile (anti-robot). Brevo envoie les e-mails du compte et les alertes sur les fonds suivis (voir « Liste de suivi et alertes e-mail »). Tout est décrit dans la version « comptes » de confidentialite.html.
Toute nouvelle clé de stockage doit être ajoutée à CLES_STOCKAGE_SITE (js/outils.js) et décrite sur confidentialite.html.
Tout nouveau service contacté par le navigateur doit aussi y être décrit.
⚠️ Éviter les noms de fichiers que les bloqueurs de publicités interdisent (ex. analyse.js, analytics.js, tracking.js) :
le fichier ne serait pas chargé chez les visiteurs équipés d'un bloqueur et le site cesserait de fonctionner pour eux.
| Fichier | Rôle |
|---|---|
data/annuaire.js | Liste de tous les fonds (générée par le script) |
js/geco.js | Appels à l'API GECO, calculs sur l'historique, lecture du DIC (pdf.js) |
js/inventaire.js | Moteur 1 : lecture de l'inventaire des rapports annuels (PDF) |
js/style.js | Moteur 2 : analyse des rendements, recherche d'un fonds jumeau |
js/composition.js | Assemble les deux moteurs, cache, préparation des alertes |
js/fiche-auto.js | Fiche automatique : détection des pièges et affichage |
js/outils.js / js/affichage.js | Outils partagés : mise en forme des nombres, alertes de concentration, graphiques en barres, liste de résultats |
js/glossaire.js | Explications des infobulles |
js/config.js | Seuils des alertes |
js/app.js | Page « Décrypte ton fonds » : recherche, navigation, réglages |
js/performances.js | Page « Performances » : chargement des séries, graphique interactif, comparaisons |
js/projection.js | Simulateur : historique reconstitué, rendement attendu, Monte Carlo, plan, fiscalité, objectif, crises, portefeuille |
js/contexte-fonds.js | Simulateur : profil d'exposition, sensibilités, tendances technologiques, facteurs économiques, géopolitique, tableau de bord des risques |
js/graphiques-simu.js | Simulateur : graphiques interactifs (éventail, répartition, crise, objectif, comparaison, corrélations) |
js/simulateur.js | Page « Simulateur » : assistant en 4 étapes, chargement des données, calculs et affichage |
data/contexte.js / data/references.js / data/marches.js | Données mises à jour chaque jour (voir plus haut) |
scripts/actualiser_contexte.py | Script de mise à jour quotidienne (bibliothèque standard Python uniquement) |
scripts/actualiser_marches.py |
js/contexte-fonds.js) : tableau de bord des risques (marché, géopolitique, change, secteur,
concentration, taux, réglementation), indicateurs économiques pertinents pour le fonds, risques géopolitiques illustrés par des titres de presse récents (datés, sourcés), exposition aux
tendances technologiques (opportunité / risque, sans recommandation).js/radiographie.js, panneau dans js/simulateur.js) : radiographie d'un contrat
(assurance-vie, PEA, compte-titres…). L'utilisateur ajoute jusqu'à 15 fonds avec un montant en euros, puis clique sur « Analyser mon contrat ».
Le site calcule :
data/alternatives.js. Un fonds aux frais inconnus est
exclu du calcul et le total est alors annoncé « au moins » ; le coût sur 10 ans (rendement brut supposé de 5 %, comme le simulateur) ;localStorage et aucun nouveau service.
Limites : pas de comparaison ligne à ligne des titres détenus par les fonds, et pas d'import d'un relevé de contrat (les fonds et montants sont saisis à la main).| Autres fonds européens (registre ESMA, hors France) | ≈ 16 300 (16 299 au 14/10/2026, de 28 pays : Luxembourg 10 759, Irlande 2 624, Suède 567, Allemagne 474, Autriche 427, Liechtenstein 312… ; 8 422 OPCVM (UCITS), 7 472 FIA, 294 EuVECA, 108 ELTIF), absents des autres lignes | ESMA – registre de la commercialisation transfrontière des OPCVM et FIA + BCE (politique, tranche d'encours), GLEIF (fonds parapluie) | Identité seule, sans ISIN (aucune part cotée connue) : société de gestion, autorité de contrôle, pays de commercialisation, type (OPCVM, FIA, ELTIF, EuVECA), LEI, politique d'investissement et tranche d'encours quand la BCE les donne, fonds parapluie. Alerte « Réservé aux investisseurs professionnels » (FIA), « ELTIF : argent bloqué longtemps », « Réservé aux investisseurs avertis » (EuVECA), et « Fonds non notifié pour la France » quand la France n'est pas dans les pays du registre. Performances et simulateur comme pour les autres fonds étrangers (fonds jumeau, sinon profil type). Les autres fonds européens du site gagnent les mêmes lignes « Autorité de contrôle », « Commercialisé dans » et « Type (registre européen) » quand le registre les connaît (≈ 9 600 fonds) |
| Aucun |
| Valeurs accessibles seulement avec un compte développeur et une clé (vérifié le 06/10/2026) |
| Écartée : la même statistique est diffusée sans clé par la BCE |
| Eurostat | Aucun | — | Écartée : l'inflation est déjà lue à la BCE (même indice) |
data/resumes.jsclassements/) : PEA classés par frais, un classement par indice, un par catégorie AMF, et un index A-Z de tous les fonds.
Les classements par frais indiquent la date de relevé des chiffres (RESUMES.maj, « chiffres relevés au … »).sitemap.xml est un index qui renvoie vers sitemap-N.xml, de 50 000 adresses au plus chacun.js/mode-site.js fixe RACINE_SITE ("" à la racine, "../" dans fonds/ et classements/) ;
les liens et les scripts des pages rangées dans un dossier commencent par ce préfixe.https://decrypte-ton-fonds.fr/ (BASE dans scripts/construire_pages.mjs, DOMAINE_SITE dans js/mode-site.js,
BASE_SITE dans scripts/alertes.mjs) : adresses canoniques, sitemap, robots.txt (écrit par construire_pages.mjs) et liens des e-mails.
Les pages servies par GitHub Pages désignent donc le domaine comme leur adresse canonique._routes.json fait passer toutes les adresses par le contrôle d'accès,
sauf des fichiers publics nommés exactement et les dossiers publics fonds/, classements/, data/cours/, data/etats-unis/ (aucun fichier protégé ;
Cloudflare ne résout pas une adresse déguisée comme /fonds/%2e%2e/simulateur.html : il répond la page par défaut). Vérifié par tests/acces.test.mjs.| Marchés et devises du jour : sources par ordre de préférence, repli, cache |
scripts/sources/ | Un module par API (format commun dans commun.py) |
scripts/tests_sources.py / scripts/sonder_api.py | Tests des sources ; sonde de la structure des API à clé |
scripts/tests_annuaire.py | Tests de l'annuaire, sans réseau : un ISIN n'ouvre qu'un seul fonds |
js/marches.js | Tableau « marchés et devises » de la fiche et du simulateur |
js/confidentialite.js | Page de confidentialité : données du site dans ce navigateur et bouton d'effacement |
js/vendor/pdfjs/ | pdf.js 3.11.174 (Mozilla, licence Apache 2.0), hébergé avec le site : aucun appel à un service tiers |
fonts/ | Police IBM Plex Sans 1.1.0 (IBM, SIL Open Font License 1.1, texte dans fonts/OFL.txt), alphabet latin, hébergée avec le site : aucun appel à un service tiers |
js/mode-site.js | Mode gratuit ou comptes selon l'adresse : liste HOTES_COMPTES, marquage de <html>, renvoi des pages de compte vers l'accueil (voir « Deux modes selon l'adresse ») |
serveur/acces.js / functions/_middleware.js | Contrôle d'accès du simulateur sur Cloudflare : actif en mode comptes seulement |
js/nav.js | Onglets communs (le fonds suit d'une page à l'autre) |
js/infobulles.js | Infobulles des termes techniques (toutes les pages) |
js/createur.js | Bouton « Créateur » et son animation |
data/resume.js | Chiffres de l'annuaire affichés sur l'accueil (générés par le script) |
scripts/construire_etats_unis.py | Fonds américains (SEC) : annuaire, composition N-PORT, rendements mensuels en euros, frais des prospectus (bibliothèque standard Python ; voir « Fonds américains (SEC) ») |
.github/workflows/etats-unis.yml | Tâche mensuelle des fonds américains, avec l'option « complet » pour tout recalculer |
data/annuaire-etats-unis.js / data/etats-unis/NN.js / data/etats-unis-isin.js | Zone « États-Unis » de l'annuaire ; détails des séries (64 fichiers, chargés à l'ouverture d'une fiche) ; ISIN européens rattachés à une série américaine (générés par le script) |
js/zones.js | Annuaire par zone : chargement à la demande, recherche dans tous les pays, ouverture d'un fonds par sa clé |
js/etats-unis.js | Fonds américains dans le navigateur : chargement des détails, historique, statistiques et composition au format du reste du site |
data/annuaire-registres-ue.js / data/registres-ue-infos.js | Zone « registres-ue » : fonds européens du registre de l'ESMA, hors France (clé R<numéro>) ; leurs informations (LEI, pays de commercialisation, politique, tranche d'encours, parapluie), chargées à l'ouverture d'une fiche (générés par scripts/construire_identite.py) |
scripts/registres_ue.py | Registre de l'ESMA : lecture, rapprochement avec l'annuaire, autorités, zone « registres-ue » (fonctions pures, bibliothèque standard Python) |
data/societes.js | Sociétés de gestion agréées par l'AMF : n° d'agrément, début d'autorisation, site (générée par scripts/construire_identite.py) |
js/alternatives.js | Alternatives moins chères : choix des fonds du même indice, calcul de l'écart de frais, bloc de la section 6 |
scripts/construire_alternatives.mjs | Tâche mensuelle (Node) : lit le DIC de chaque candidat dans le prospectus GECO avec pdf.js ; génère data/alternatives.js |
data/alternatives.js | Fonds de référence par indice, avec leurs frais lus dans le DIC (générée par le script) |
.github/workflows/alternatives.yml | Tâche mensuelle des alternatives (le 25 de chaque mois, 06 h 47 UTC) |
scripts/lecture_dic.mjs | Lecture d'un DIC (pdf.js) : frais, SRI, durée recommandée, objectif ; part (ISIN) d'abord, puis documents du fonds |
scripts/construire_resumes.mjs | Tâche hebdomadaire (Node) : lit au plus 2 500 DIC par lancement, en 110 minutes au plus (--minutes) ; génère data/resumes.js |
data/resumes.js | Résumés des DIC et suivi des essais, sans DIC et erreurs (générée par le script) |
scripts/construire_pages.mjs | Génère fonds/*.html, classements/*.html, sitemap.xml et sitemap-N.xml |
fonds/ / classements/ / sitemap*.xml | Pages fixes des fonds, classements et plans du site pour Google (générés, voir « Pages des fonds pour Google ») |
.github/workflows/resumes.yml | Tâche hebdomadaire des résumés et des pages (lundi, 01 h 13 UTC) ; pages seules à chaque envoi sur main qui touche l'annuaire, le gabarit ou leur code |
tests/ | Tests sans réseau, tous lancés par node --test "tests/*.test.mjs" : mode-site.test.mjs (règle de bascule, marquage de <html>, renvoi des pages de compte, attribut hidden), acces.test.mjs (contrôle d'accès de Cloudflare), pages.test.mjs (en-tête, pied de page, textes, éléments réservés au mode comptes), textes-gratuits.test.mjs (texte visible dans chaque mode : pages légales, pages de compte), pages-compte.test.mjs (pages du compte, démarrage de leurs scripts en mode comptes seulement), compte.test.mjs (js/compte.js), comptes.test.mjs (suppression de compte, avertissement d'inactivité), stripe.test.mjs (paiement Stripe), couleurs.test.mjs (palette, contrastes, police), simulateur-fiscalite.test.mjs (fiscalité du simulateur), sources-officielles.test.mjs (sources officielles), zones.test.mjs (annuaire par zone), etats-unis.test.mjs (fonds américains dans le navigateur), fiche-etats-unis.test.mjs (fiche d'un fonds américain), fiche-registres-ue.test.mjs (registre de l'ESMA : fiche d'un fonds européen du registre, alertes des FIA étrangers de GECO, lignes d'autorité et de pays des fonds européens, alertes, ouverture dans Performances et Simulateur), performances-simulateur-etats-unis.test.mjs (Performances et simulateur pour les fonds américains), alternatives.test.mjs et construire-alternatives.test.mjs (alternatives moins chères : choix, bloc, script de construction), radiographie.test.mjs (radiographie Mon contrat : exposition cumulée, doublons, frais en euros), pdf-securite.test.mjs (pdf.js lancé avec isEvalSupported: false), lecture-dic.test.mjs (lecture d'un DIC), construire-resumes.test.mjs (choix des fonds à lire, garde-fous), pages-fonds.test.mjs (page d'un fonds, classements, sitemaps) et pages-site.test.mjs (pages fixes : liens, préfixe RACINE_SITE, scripts). En Python : test_sources_officielles.py (python3 tests/test_sources_officielles.py -v), test_etats_unis.py (python3 tests/test_etats_unis.py -v, fonds américains : listes, N-PORT, rendements, frais, conversion en euros) et test_registres_ue.py (python3 tests/test_registres_ue.py -v, registre de l'ESMA), sans réseau, et test_supabase.py, qui appelle le vrai projet Supabase, celui qui contient les vrais comptes du site (base partagée) : il refuse de démarrer sans TESTS_SUPABASE=oui-base-des-comptes (à lancer à part : TESTS_SUPABASE=oui-base-des-comptes python3 -m unittest tests/test_supabase.py -v), ne touche qu'à ses comptes jetables test-…@example.com (supprimés à la fin) et n'affiche jamais l'adresse d'un autre compte ; les tests qui changent l'interrupteur paiement, visible par tous les visiteurs, sont ignorés sauf avec TESTS_PAIEMENT=oui en plus. Vrais extraits des sources dans tests/donnees/ |