Commit Graph
561 Commits
Author SHA1 Message Date
IliesAllaliandClaude Fable 5.2 ae0d52ca46 Nettoyage : routes d'API que l'app n'appelle plus, fichiers de la landing sans lien
- GET /trees/:id/stats et /trees/:id/audit retirées, avec leur entrée dans l'OpenAPI
- annotation seule (POST, GET, PATCH, DELETE /trees/:id/annotations) retirée : l'app lit les annotations dans le graphe et écrit par /annotations/batch
- landing : six SVG de hero/, aide/accueil.webp (fr et en) et og-image-hero.png, liés par aucune page

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-12 14:09:39 +01:00
IliesAllali bbbb5eb3ce Merge pull request #230 from IliesAllali/chore/nettoyage-2026-11-12
Nettoyage : code mort, restes d'anciennes versions, doublons regroupés
2026-11-12 13:57:01 +01:00
IliesAllali 23d3f81930 Merge remote-tracking branch 'origin/main' into chore/nettoyage-2026-11-12 2026-11-12 13:49:10 +01:00
IliesAllali 4c16af393d Merge pull request #229 from IliesAllali/fix/youtube-liens-integration
Souvenirs : une vidéo YouTube se colle sous toutes ses formes
2026-11-12 13:40:16 +01:00
IliesAllaliandClaude Opus 5.5 652fe49e8d Souvenirs : une vidéo YouTube se colle sous toutes ses formes
Le champ « Un lien YouTube » acceptait tout lien en youtube.com, mais la
visionneuse ne lisait que watch?v= et youtu.be : un lien d'intégration
(/embed/), un Short ou un direct s'enregistrait puis s'affichait « Lien
YouTube invalide », et le code <iframe> du bouton Intégrer était refusé.

Une seule fonction (utils/youtube.js) retrouve l'identifiant de la vidéo
dans le lien de la barre d'adresse, de partage, d'intégration, nocookie,
un Short, un direct ou le code <iframe> complet. La saisie enregistre
toujours le lien watch?v= et la visionneuse s'appuie sur la même fonction,
donc les liens /embed/ déjà enregistrés se lisent aussi.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 13:37:18 +01:00
IliesAllaliandClaude Fable 5.2 3b156f926e Nettoyage : react.svg du gabarit Vite retiré
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-12 13:01:00 +01:00
IliesAllaliandClaude Fable 5.2 70229a5827 Nettoyage : doublons regroupés, composant et traductions sans lecteur, backend
- utils/richText.jsx : withEmphasis et richText, écrits six fois dans les composants
- useAuth : openSession, commun à la connexion et à l'inscription
- TreeDropdown retiré (rendu nulle part, tenu par un seul test), 52 entrées du dictionnaire anglais sans texte dans le code
- backend : sealed-secret.ts (chiffrement commun au mot de passe de partage et à la clé Immich), cleanGedcomPlace en un exemplaire, fonctions sans appelant (recordTreeUnlockFailure, resetOidcConfiguration, readMediaPeople, annotationPhotoRelativePath), exports internes refermés

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-12 12:58:24 +01:00
IliesAllaliandClaude Fable 5.2 4c80dea44a Nettoyage frontend : styles et fonctions sans appelant, drapeau ?layout=sugiyama, en-tête d'autorisation partagé
- CSS : règles des anciens écrans (assistant de création, gestionnaire de souvenirs, réglages, lecteur vidéo), keyframes et variable sans lecteur
- Fonctions sans appelant : mockData (3), treeApi (stats, audit), getMediaToken, drawPathLabel, NavButton
- Fichiers-barils navbar/ et search/ remplacés par des imports directs
- Galaxy : le placement par blocs est le seul chemin
- api/client.js : bearer(token) remplace 59 en-têtes écrits à la main ; import dynamique inutile de client.js retiré

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-12 12:51:56 +01:00
IliesAllali f8d1a48240 Merge pull request #222 from fridgee1/feat/plusieurs-langues
Langues : liste de langues au lieu du seul couple français/anglais
2026-11-11 13:41:44 +01:00
IliesAllali 3f1d8f9ccd Merge pull request #223 from IliesAllali/fix/plusieurs-conjoints-isoles
Placement : plusieurs conjoints isolés ne se chevauchent plus
2026-11-11 13:01:00 +01:00
IliesAllaliandClaude Opus 5.5 5b18229a97 Placement : plusieurs conjoints isolés ne se chevauchent plus
Une personne avec deux conjoints isolés ou plus (sans parent ni enfant
dans l'arbre) voyait leurs petits portraits s'enchaîner à 40 px : noms
et dates les uns sur les autres, chacun collé au précédent. Le petit
portrait reste collé à son conjoint ; à côté d'un autre conjoint, l'écart
normal revient. Le cas d'un seul conjoint isolé ne bouge pas.

Banc : deux archétypes (plusieurs-petits-conjoints, trois-petits-conjoints).
L'invariant « couples séparés » ne compte plus une personne à trois
conjoints ou plus : elle n'en touche que deux sur sa rangée.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 12:30:23 +01:00
SebastianandClaude Opus 5.5 94c38bdeb9 Langues : le choix de langue échappe à la traduction du navigateur
La traduction automatique (Chrome, Vivaldi…) transformait « FR · EN » en
mots (« EN » → « IN ») sur une page affichée dans une autre langue que celle
du navigateur.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Sebastian <fridgee@duck.com>
2026-11-10 18:45:32 +01:00
SebastianandClaude Opus 5.5 3bd3df4627 Langues : liste de langues au lieu du seul couple français/anglais (#221)
LANGUAGES décrit chaque langue (nom, région des dates, dictionnaire) ; la
détection, la région des dates, le bouton de choix et les liens d'aide
s'en servent. Un texte absent d'un dictionnaire retombe sur l'anglais, puis
sur le français. Rien ne change pour le français et l'anglais.

Le test exige toujours l'anglais ; pour les autres langues, il signale les
textes pas encore traduits sans échouer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Sebastian <fridgee@duck.com>
2026-11-10 18:45:32 +01:00
IliesAllaliandClaude Opus 5.5 3fefb4542e Parenté : demi-frère et quasi-frère (#218)
Un enfant du conjoint d'un parent était nommé « Brother-in-law » en anglais,
et un enfant d'un seul parent en commun « Brother ». Le nommage lit
maintenant la suite des pas : up,down = demi (Half-brother, Demi-frère),
up,spouse,down = Stepbrother en anglais ; le français garde Beau-frère,
usage courant pour le quasi-frère.

Closes #218

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 11:44:40 +01:00
IliesAllali 92e3c74673 Revert "Merge pull request #217 from IliesAllali/feat/onglets-nom-et-proches"
This reverts commit 82ae5e289d, reversing
changes made to 09b2acf4fe.
2026-11-07 01:54:20 +01:00
IliesAllali 4a447c7aef Revert "Merge pull request #219 from IliesAllali/feat/onglets-par-nom"
This reverts commit 4544edde6f, reversing
changes made to 82ae5e289d.
2026-11-07 01:54:19 +01:00
IliesAllali 79df032f10 Revert "Merge pull request #220 from IliesAllali/feat/reglages-arbre-onglets"
This reverts commit 97966054ac, reversing
changes made to 4544edde6f.
2026-11-07 01:54:19 +01:00
IliesAllali 97966054ac Merge pull request #220 from IliesAllali/feat/reglages-arbre-onglets
Onglets : « Tout l'arbre » en option et vraiment complet, ancien découpage par largeur retiré
2026-11-07 01:44:43 +01:00
IliesAllaliandClaude Opus 5.5 e787e4488e onglets : « Tout l'arbre » seulement si coché, sinon la famille de la personne de départ s'ouvre
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 01:40:50 +01:00
IliesAllaliandClaude Opus 5.5 1256f09c8f nettoyage : l'ancien découpage par largeur retiré du placement, des pastilles, de la barre et du CSS
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 01:18:18 +01:00
IliesAllaliandClaude Opus 5.5 5eb1d9e7bd Tout l'arbre : plus aucune belle-famille réduite derrière une pastille quand l'arbre est dessiné en entier
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 01:14:13 +01:00
IliesAllali 4544edde6f Merge pull request #219 from IliesAllali/feat/onglets-par-nom
Onglets de familles : un onglet par nom, seuil réglable au curseur
2026-11-07 00:48:47 +01:00
IliesAllaliandClaude Opus 5.5 b89ceb4e00 réglages : curseur du seuil, onglets créés affichés en direct
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 00:45:15 +01:00
IliesAllaliandClaude Opus 5.5 61d9bcc328 réglages : « À partir de N personnes au même nom »
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 00:11:32 +01:00
IliesAllaliandClaude Opus 5.5 8f770371fb réglages : seuil des onglets sur une ligne
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 00:10:37 +01:00
IliesAllaliandClaude Opus 5.5 8cbe5ce262 onglets par nom : repère pris à l'écran, pas de doublon de Tout l'arbre
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 00:08:43 +01:00
IliesAllaliandClaude Opus 5.5 9b77cca771 onglets : un onglet par nom de famille, seuil réglable, ancien découpage par largeur retiré
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 00:04:25 +01:00
IliesAllali 82ae5e289d Merge pull request #217 from IliesAllali/feat/onglets-nom-et-proches
Onglets de familles : les porteurs du nom dans leur famille, proches de l'autre côté réglables
2026-11-06 18:25:59 +01:00
IliesAllaliandClaude Opus 5.5 642b6020c3 onglets : les porteurs du nom dans leur famille, proches de l'autre côté réglables
Un enfant d'un membre qui porte le nom d'un onglet entre dans cet onglet (nom de naissance d'abord,
homonymes sans lien laissés dehors), avec son couple ; l'autre parent est estompé. Nouveau réglage
d'affichage : proches de l'autre côté à 0, 1, 2 ou 3 liens, 1 par défaut. Libellés des réglages
d'affichage réécrits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 18:12:21 +01:00
dependabot[bot] 09b2acf4fe build(deps): bump the frontend-minor-patch group (#216)
Bumps the frontend-minor-patch group in /frontend with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [@lucide/icons](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide) | `1.61.0` | `1.66.0` |
| [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `1.61.0` | `1.66.0` |
| [posthog-js](https://github.com/PostHog/posthog-js) | `1.438.21` | `1.444.0` |
| [eslint](https://github.com/eslint/eslint) | `10.13.0` | `10.14.0` |
| [globals](https://github.com/sindresorhus/globals) | `17.13.0` | `17.14.0` |


Updates `@lucide/icons` from 1.61.0 to 1.66.0
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.66.0/packages/lucide)

Updates `lucide-react` from 1.61.0 to 1.66.0
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.66.0/packages/lucide-react)

Updates `posthog-js` from 1.438.21 to 1.444.0
- [Release notes](https://github.com/PostHog/posthog-js/releases)
- [Changelog](https://github.com/PostHog/posthog-js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/PostHog/posthog-js/compare/posthog-js@1.438.21...posthog-js@1.444.0)

Updates `eslint` from 10.13.0 to 10.14.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v10.13.0...v10.14.0)

Updates `globals` from 17.13.0 to 17.14.0
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](https://github.com/sindresorhus/globals/compare/v17.13.0...v17.14.0)

---
updated-dependencies:
- dependency-name: "@lucide/icons"
  dependency-version: 1.66.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: frontend-minor-patch
- dependency-name: lucide-react
  dependency-version: 1.66.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: frontend-minor-patch
- dependency-name: posthog-js
  dependency-version: 1.444.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: frontend-minor-patch
- dependency-name: eslint
  dependency-version: 10.14.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: frontend-minor-patch
- dependency-name: globals
  dependency-version: 17.14.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: frontend-minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-06 12:20:06 +01:00
dependabot[bot] 51924229da build(deps): bump the backend-minor-patch group (#215)
Bumps the backend-minor-patch group in /backend with 2 updates: [@fastify/cookie](https://github.com/fastify/fastify-cookie) and [@fastify/jwt](https://github.com/fastify/fastify-jwt).


Updates `@fastify/cookie` from 11.1.3 to 11.1.5
- [Release notes](https://github.com/fastify/fastify-cookie/releases)
- [Commits](https://github.com/fastify/fastify-cookie/compare/v11.1.3...v11.1.5)

Updates `@fastify/jwt` from 10.2.5 to 10.2.6
- [Release notes](https://github.com/fastify/fastify-jwt/releases)
- [Commits](https://github.com/fastify/fastify-jwt/compare/v10.2.5...v10.2.6)

---
updated-dependencies:
- dependency-name: "@fastify/cookie"
  dependency-version: 11.1.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: backend-minor-patch
- dependency-name: "@fastify/jwt"
  dependency-version: 10.2.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: backend-minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-06 12:19:58 +01:00
dependabot[bot] 64979ef66a build(deps): bump posthog-js (#214)
Bumps the landing-minor-patch group in /landing with 1 update: [posthog-js](https://github.com/PostHog/posthog-js).


Updates `posthog-js` from 1.438.21 to 1.444.0
- [Release notes](https://github.com/PostHog/posthog-js/releases)
- [Changelog](https://github.com/PostHog/posthog-js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/PostHog/posthog-js/compare/posthog-js@1.438.21...posthog-js@1.444.0)

---
updated-dependencies:
- dependency-name: posthog-js
  dependency-version: 1.444.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: landing-minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-06 12:19:32 +01:00
IliesAllaliandClaude Opus 5.5 ef620c9cb5 mesure : copie du lien de partage, page vie privée à jour
share_copied quand le propriétaire copie le lien, le mot de passe ou le message d'invitation
(what, seasonal pour le message de Noël), ou crée le lien d'un co-gestionnaire (manager_invite).
Rien de ce qui est copié ne part. La page vie privée (fr, en) décrit maintenant tout ce que l'app
mesure : démo, modifications comptées sans leur contenu, propositions, partage.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 19:32:10 +01:00
IliesAllaliandClaude Opus 5.5 332b5711ff mesure : proposal_sent pour toutes les propositions
L'événement ne partait que de la fenêtre d'envoi (App.jsx) : les raccourcis de la fiche passent par
handleSubmitContributionSession sans lui, d'où zéro proposal_sent en 60 jours pour deux propositions
relues. L'événement part maintenant de la fonction commune, après réponse du serveur, avec le statut
(pending, ou approved pour un co-gestionnaire).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 19:24:19 +01:00
IliesAllaliandClaude Opus 5.5 9bf55a16f3 landing : mesure d'audience des pages statiques, provenance gardée jusqu'à l'app
Les guides, l'aide, la vidéo et les pages vie privée (public/, copiés sans Vite) n'avaient aucune
mesure. src/pages.js, construit par Vite avec une empreinte et posé au build dans chaque page par
scripts/inject-pages.mjs, envoie les mêmes événements que la page d'accueil (page_viewed, scroll_depth_50
et 100, signup_cta_clicked) et video_played sur /video/. Les liens vers l'app gardent le ?source=
d'arrivée au lieu de la provenance fixe de la page. Page vie privée (fr, en) complétée.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 19:01:07 +01:00
IliesAllaliandClaude Opus 5.5 2c7e5361cc texte : l'invitation de Noël parle aussi de la voix
Le message d'invitation de décembre (SIGNUP_PROMPTS) propose d'enregistrer
une histoire de famille racontée à table, en plus des vieilles photos.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 18:09:16 +01:00
IliesAllaliandClaude Opus 5.5 98de13aaa0 deps(front): minimatch 11 pour eslint (alerte Dependabot #24)
minimatch < 11.0.1 (déni de service par amplification des globparts). Seul eslint
en dépend, outillage de dev ; Dependabot ne peut pas monter la version lui-même
(eslint demande ^10), d'où l'override. Lint, 359 tests, build, npm audit à 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 17:29:36 +01:00
IliesAllaliandClaude Opus 5.5 1558b0dc6b 1.6.0 : changelog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v1.6.0
2026-11-04 17:23:49 +01:00
IliesAllali ce82aa5f3b Merge pull request #213 from IliesAllali/fix/photos-couple
Onglet Vie : les photos d'un mariage chez les deux conjoints
2026-11-04 17:23:21 +01:00
IliesAllaliandClaude Opus 5.5 43dda9c962 fix(vie): les photos d'un mariage se voient chez les deux conjoints (#209)
Le moment du couple arrivait bien chez les deux, mais ses souvenirs n'étaient cherchés
que parmi ceux de la fiche ouverte. L'onglet Vie et la fenêtre d'un moment du couple
lisent aussi les souvenirs du conjoint ; une photo du conjoint s'ouvre à son nom.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 16:41:16 +01:00
IliesAllaliandClaude Opus 5.5 69b08116cf i18n(en): Partner à la place de Spouse sur la fiche et l'arbre
Même mot que les liens de parenté depuis #204 : « spouse » suppose un mariage,
« conjoint » non.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 16:39:13 +01:00
IliesAllali 419fa4cda0 Merge pull request #204 from Arc676/cousins
Fix some English relations
2026-11-04 16:38:05 +01:00
IliesAllaliandClaude Opus 5.5 68ab7924f2 ci(images): la vraie version dans le label OCI (#207)
org.opencontainers.image.version vaut X.Y.Z sur un tag et la sortie de git describe
sur main (1.5.9-11-gd5f9da6), au lieu de « latest ».

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 16:33:25 +01:00
IliesAllali d5f9da6777 Merge pull request #212 from IliesAllali/feat/demo-creer-mon-arbre
feat(demo): « Créer mon arbre » en bouton noir de la barre
2026-11-03 16:54:03 +01:00
IliesAllaliandClaude Opus 5.5 0ef5d08fec feat(demo): « Créer mon arbre » en bouton noir de la barre, « Modifier » en clair
Dans la démo, l'inscription n'était que dans le menu du rond de profil et dans un
lien après une modification. Elle devient le bouton noir de la barre du bas ;
« Modifier » reste à côté en clair (crayon seul sur téléphone) et quitte le noir.
« Créer mon arbre » quitte le menu du rond pour ne pas apparaître deux fois.

Seulement sur l'instance qui invite à s'inscrire (SIGNUP_PROMPTS, inscription
ouverte), sans compte, et pas dans la démo intégrée à la landing (?embed).
Clic suivi : create_account_clicked, via=demo-barre.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 16:48:17 +01:00
IliesAllali 7b7a589062 Merge pull request #211 from IliesAllali/fix/lien-source-demo
fix(entree): un lien de diffusion (?source=) sans session ouvre la démo
2026-11-03 16:34:02 +01:00
IliesAllaliandClaude Opus 5.5 0cf851475f fix(entree): un lien de diffusion (?source=) sans session ouvre la démo
Depuis l'accueil à deux choix (18/10), un visiteur sans session arrivé par
app.parenthese.io/?source=… tombait sur « Que voulez-vous faire ? » au lieu
de l'arbre d'exemple. Tous les liens de diffusion (presse, créateurs, groupes)
sont écrits sans ?demo, dont plusieurs déjà envoyés.

Sans session et avec ?source : la démo, comme avant. Sans paramètre : l'accueil
à deux choix reste. ?account=register et les liens de famille ne changent pas.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 16:26:02 +01:00
IliesAllaliandClaude Opus 5.5 db09620a58 Page vidéo : Parenthèse en 30 secondes (#210)
/video/ sur parenthese.io : la vidéo validée par Patch le 03/11, en 16:9 sur
ordinateur et 9:16 sur téléphone (la seconde ne se charge qu'au besoin), aperçu,
balises og:video et JSON-LD VideoObject, bouton vers l'arbre d'exemple
(source=video). Lien à donner dans les mails de presse et aux créateurs.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 11:33:09 +01:00
IliesAllaliandClaude Opus 5.5 374fa35fbd Guide anglais « A family tree as a Christmas gift » (#208)
/en/family-tree-gift/, pendant du guide de Noël français (hreflang dans les deux sens,
lien English et Français dans le pied de page), lien dans le pied de page des huit pages
anglaises, plan du site. « family tree gift » : 590 recherches par mois aux États-Unis,
1 900 en décembre (DataForSEO, 02/11).

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 15:17:19 +01:00
IliesAllaliandClaude Opus 5.5 bb6ad7d5d2 Guide « Arbre généalogique en cadeau de Noël » (#206)
Nouvelle page /arbre-genealogique-cadeau-noel/ sur le gabarit des guides (HowTo et FAQPage
en JSON-LD, français seul), lien dans le pied de page des huit pages françaises, plan du site.
Bouton avec source=guide-noel. En ligne avant mi-novembre pour être classée en décembre
(« arbre généalogique cadeau » x3,4 en décembre).

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 01:38:42 +01:00