From fff860314b64fcd79e58055470ccde065a1563cb Mon Sep 17 00:00:00 2001
From: Clement <159007607+csanchez-jetdev@users.noreply.github.com>
Date: Sat, 1 Aug 2026 18:10:26 +0200
Subject: [PATCH 1/3] =?UTF-8?q?feat:=20page=20=C3=80=20propos,=20cache=20d?=
=?UTF-8?q?es=20images=20et=20styles=20inlin=C3=A9s?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.nuxtrc | 2 +-
README.md | 15 +-
app/pages/a-propos.vue | 257 ++
app/pages/app.vue | 13 +-
app/pages/depuis/[slug].vue | 24 +-
app/pages/index.vue | 82 +-
nuxt.config.ts | 69 +-
package.json | 16 +-
pnpm-lock.yaml | 4706 +++++++++++++++++-----------------
server/routes/sitemap.xml.ts | 3 +-
10 files changed, 2789 insertions(+), 2398 deletions(-)
create mode 100644 app/pages/a-propos.vue
diff --git a/.nuxtrc b/.nuxtrc
index 640f280..0e6b68e 100644
--- a/.nuxtrc
+++ b/.nuxtrc
@@ -1 +1 @@
-setups.@nuxt/test-utils="4.0.3"
\ No newline at end of file
+setups.@nuxt/test-utils="4.1.0"
\ No newline at end of file
diff --git a/README.md b/README.md
index 85ffdd4..5917241 100644
--- a/README.md
+++ b/README.md
@@ -100,9 +100,13 @@ condition de publier vos modifications.
Un abonnement SNCF pour les 16-27 ans qui donne accès à un nombre illimité de trajets sur les
trains éligibles, dans la limite des places réservées à l'abonnement. Ces places sont
-contingentées : un train peut circuler sans être ouvert à TGVmax. C'est ce contingent que
+contingentées : un train peut circuler sans être ouvert à l'abonnement. C'est ce contingent que
Trainquillou rend visible.
+La SNCF a renommé l'offre **MAX JEUNE** en 2023. « TGVmax » reste le nom sous lequel la plupart
+des abonnés la connaissent, et celui du dataset open data : les deux termes cohabitent donc dans
+l'interface et dans les métadonnées, sans en privilégier un.
+
### Trainquillou réserve-t-il mes billets ?
Non. Il montre où il reste des places et renvoie vers SNCF Connect ou Trainline pour la
@@ -128,9 +132,12 @@ service gratuit, sans but lucratif.
### Mes visites sont-elles suivies ?
-L'instance officielle mesure son audience avec [Rybbit](https://rybbit.io) : sans cookie, sans
-identifiant persistant, sans profil publicitaire, données hébergées dans l'UE. Aucun bandeau de
-consentement n'est nécessaire, faute de donnée personnelle collectée.
+L'instance officielle mesure son audience avec [Rybbit](https://rybbit.com) : sans cookie, sans
+identifiant persistant, sans profil publicitaire, et sans stockage des adresses IP d'après sa
+[politique de confidentialité](https://rybbit.com/privacy). Aucun bandeau de consentement n'est
+nécessaire, faute de donnée personnelle collectée.
+
+Le site lui-même tourne sur un VPS OVH à Gravelines (Nord, France), sans CDN intermédiaire.
Rien de tout cela n'est actif dans le code que vous clonez : la mesure ne s'active que si vous
fournissez votre propre identifiant au build (voir ci-dessous). Une instance auto-hébergée
diff --git a/app/pages/a-propos.vue b/app/pages/a-propos.vue
new file mode 100644
index 0000000..780f937
--- /dev/null
+++ b/app/pages/a-propos.vue
@@ -0,0 +1,257 @@
+
+
+
+
+
+
+
+
+
+ Trainquillou
+
+
+
+
+ Ouvrir l'application →
+
+
+
+
+
+
+
+
+
+ À propos de Trainquillou
+
+
+
+ Trainquillou est un projet indépendant, né d'un besoin très simple : savoir
+ où l'abonnement TGVmax (aujourd'hui MAX JEUNE) permet d'aller un jour donné,
+ plutôt que de tester les villes une par une dans un moteur de réservation. La réponse
+ existe dans les données ouvertes de la SNCF ; il manquait juste une carte pour la lire.
+
+
+
+ Le site est développé et maintenu par Clément, sur son
+ temps libre, et son code est public sous licence AGPL-3.0 : chacun peut le lire, le
+ vérifier, le corriger ou en faire tourner sa propre instance. Il est gratuit et le
+ restera — pas d'offre payante en préparation, pas de fonctionnalité gardée derrière un
+ compte.
+
+ La liste des trajets origine-destination sur une fenêtre glissante de 30 jours, avec
+ pour chacun un indicateur : des places d'abonnement sont ouvertes à la réservation,
+ ou non. Trainquillou ne garde que les premiers. C'est la SNCF qui publie cet
+ indicateur, nous ne le calculons pas.
+
+
+
+
Fenêtre de 30 jours
+
+ Ce n'est pas une limite que le site s'impose : les places d'abonnement n'ouvrent que
+ 30 jours avant le départ, et le jeu de données ne contient rien au-delà. Le
+ sélecteur de date s'arrête donc là.
+
+
+
+
Fraîcheur
+
+ La SNCF rafraîchit le jeu de données chaque jour en début de matinée. Pour ne pas
+ marteler son API, Trainquillou garde chaque recherche 10 minutes en cache côté
+ serveur, et la liste des gares 6 heures. Une place peut donc partir entre le moment
+ où elle s'affiche ici et celui où vous la réservez.
+
+
+
+
Ce que le site ne sait pas faire
+
+ Il n'accède pas à votre abonnement, ne réserve rien, ne connaît pas le nombre de
+ places restantes sur un train, et ne distingue pas MAX JEUNE de MAX SENIOR : le jeu
+ de données publie un seul indicateur pour les deux. Il vous montre où chercher, la
+ réservation se fait sur SNCF Connect.
+
+
+
+
+
+
+
+
Où le site est hébergé
+
+ Sur un serveur privé virtuel loué chez OVH, dans son
+ centre de données de Gravelines (Nord, France). Pas de
+ CDN intermédiaire, pas de réplication hors de France : les requêtes vont du navigateur à
+ cette machine, et nulle part ailleurs. Seul le fond de carte est servi par un tiers,
+ OpenFreeMap, à partir des données d'OpenStreetMap.
+
+
+ Hébergeur : OVH SAS, 2 rue Kellermann, 59100 Roubaix, France — RCS Lille Métropole
+ 424 761 419.
+
+
+
+
+
+
Ce que le site mesure
+
+ Le strict nécessaire pour savoir si quelqu'un s'en sert. L'instance officielle utilise
+ Rybbit, une mesure d'audience open source qui fonctionne
+ sans cookie, sans identifiant persistant et sans
+ stocker les adresses IP. Il n'y a ni régie publicitaire, ni traceur commercial, ni
+ revente, ni profilage — et donc rien à accepter dans une bannière.
+
+
+ Le site lui-même ne demande aucun compte et n'enregistre aucune donnée personnelle : vos
+ recherches vivent dans l'URL de votre navigateur, pas dans une base. Une instance
+ auto-hébergée n'a par défaut aucune mesure d'audience du tout — elle s'active par
+ variable d'environnement au moment de la construction.
+
+
+
+
+
+
Nous écrire, contribuer
+
+ Un libellé de gare mal placé sur la carte, une destination manquante, une idée, un
+ désaccord : tout passe par le dépôt GitHub, qui sert à la fois de boîte aux lettres et
+ d'historique public des corrections. Les signalements y sont visibles de tous, ce qui
+ vaut mieux qu'un e-mail privé pour un projet ouvert.
+
diff --git a/app/pages/depuis/[slug].vue b/app/pages/depuis/[slug].vue
index d03585c..dcc9439 100644
--- a/app/pages/depuis/[slug].vue
+++ b/app/pages/depuis/[slug].vue
@@ -27,10 +27,10 @@ const others = computed(() => {
const { public: { siteUrl } } = useRuntimeConfig()
const canonical = computed(() => `${siteUrl.replace(/\/$/, '')}/depuis/${slug.value}`)
-const title = computed(() => `Destinations TGVmax depuis ${name.value} — Trainquillou`)
+const title = computed(() => `Destinations TGVmax / MAX JEUNE depuis ${name.value} — Trainquillou`)
const description = computed(
- () => `Toutes les destinations TGVmax réservables depuis ${name.value}, sur une carte. `
- + `Aller-retour week-end, dates de retour, itinéraires avec correspondances. `
+ () => `Toutes les destinations TGVmax (MAX JEUNE) réservables depuis ${name.value}, sur une `
+ + `carte. Aller-retour week-end, dates de retour, itinéraires avec correspondances. `
+ `Gratuit, sans compte.`,
)
@@ -64,7 +64,15 @@ useHead(() => ({
-
+
+
Trainquillou
@@ -87,8 +95,9 @@ useHead(() => ({
Destinations TGVmax depuis {{ name }}
- Où partir depuis {{ name }} avec votre abonnement TGVmax ? Choisissez une date, et toutes
- les destinations où il reste des places réservables apparaissent sur une carte.
+ Où partir depuis {{ name }} avec votre abonnement TGVmax, renommé MAX JEUNE par la SNCF ?
+ Choisissez une date, et toutes les destinations où il reste des places réservables
+ apparaissent sur une carte.
@@ -161,6 +170,9 @@ useHead(() => ({
rel="noopener"
>open data SNCF. Trainquillou n'est pas affilié à la SNCF et ne vend pas de billets ;
la réservation se fait sur SNCF Connect.
+
+ Méthode, sources et hébergement
+ .
diff --git a/app/pages/index.vue b/app/pages/index.vue
index 3e5fc3d..1ece680 100644
--- a/app/pages/index.vue
+++ b/app/pages/index.vue
@@ -41,13 +41,19 @@ const FAQ = [
q: 'Qu\'est-ce que TGVmax ?',
a: 'Un abonnement SNCF pour les 16-27 ans donnant accès à un nombre illimité de trajets sur '
+ 'les trains éligibles, dans la limite des places réservées à l\'abonnement. Ces places sont '
- + 'contingentées : un train peut circuler sans être ouvert à TGVmax. C\'est ce contingent que '
- + 'Trainquillou rend visible.',
+ + 'contingentées : un train peut circuler sans être ouvert à l\'abonnement. C\'est ce '
+ + 'contingent que Trainquillou rend visible.',
+ },
+ {
+ q: 'TGVmax ou MAX JEUNE : quel est le bon nom ?',
+ a: 'Les deux désignent le même abonnement. La SNCF l\'a renommé MAX JEUNE en 2023, aux côtés '
+ + 'de MAX ACTIF et MAX SENIOR ; « TGVmax » reste le nom sous lequel la plupart des abonnés '
+ + 'le connaissent, et celui du jeu de données open data. Trainquillou emploie donc les deux.',
},
{
q: 'Trainquillou est-il gratuit ?',
- a: 'Oui, entièrement. Pas de compte, pas de paywall, pas de publicité, pas de traceur '
- + 'analytique. Le code est ouvert sous licence AGPL-3.0.',
+ a: 'Oui, entièrement. Pas de compte, pas de paywall, pas de publicité, pas de régie ni de '
+ + 'traceur commercial. Le code est ouvert sous licence AGPL-3.0.',
},
{
q: 'Trainquillou réserve-t-il mes billets ?',
@@ -56,8 +62,10 @@ const FAQ = [
},
{
q: 'Les disponibilités sont-elles à jour ?',
- a: 'Elles proviennent du jeu de données open data SNCF « tgvmax » et sont mises en cache dix '
- + 'minutes par recherche. Une place peut donc partir entre l\'affichage et votre réservation.',
+ a: 'Elles proviennent du jeu de données open data SNCF « tgvmax », que la SNCF rafraîchit '
+ + 'chaque jour en début de matinée. Trainquillou garde chaque recherche dix minutes en cache '
+ + 'pour ne pas marteler son API. Une place peut donc partir entre l\'affichage et votre '
+ + 'réservation.',
},
{
q: 'Combien de gares sont couvertes ?',
@@ -67,7 +75,20 @@ const FAQ = [
{
q: 'Comment trouver un aller-retour pour un week-end ?',
a: 'Le mode « Aller-retour » demande une date de départ et une date de retour, puis n\'affiche '
- + 'que les destinations dont les deux trajets ont des places TGVmax réservables.',
+ + 'que les destinations dont les deux trajets ont des places réservables.',
+ },
+ {
+ q: 'Qui est derrière Trainquillou ?',
+ a: 'Un projet indépendant, développé et maintenu par Clément sur son temps libre, dont le code '
+ + 'est public sous licence AGPL-3.0. Les signalements et les demandes passent par les issues '
+ + 'du dépôt GitHub, où l\'historique des corrections est visible de tous.',
+ },
+ {
+ q: 'Où le site est-il hébergé, et que mesure-t-il ?',
+ a: 'Sur un serveur privé loué chez OVH, à Gravelines (Nord, France), sans CDN intermédiaire. '
+ + 'La mesure d\'audience de l\'instance officielle est assurée par Rybbit, qui fonctionne '
+ + 'sans cookie, sans identifiant persistant et sans stocker les adresses IP — d\'où l\'absence '
+ + 'de bannière de consentement. Aucun compte, aucune donnée personnelle enregistrée.',
},
]
@@ -75,7 +96,7 @@ const { public: { siteUrl } } = useRuntimeConfig()
const base = siteUrl.replace(/\/$/, '')
useHead({
- title: 'Trainquillou — destinations TGVmax sur une carte, gratuit et sans compte',
+ title: 'Trainquillou — destinations TGVmax (MAX JEUNE) sur une carte, gratuit',
link: [{ rel: 'canonical', href: base }],
meta: [{ property: 'og:url', content: base }],
script: [
@@ -120,10 +141,14 @@ useHead({
suggestions du champ gare se faisait couper au bord du bloc.
-->
-
+
-
+
+
Trainquillou
@@ -164,8 +201,8 @@ useHead({
sur une carte, en un coup d'œil.
- Trouvez où partir avec votre abonnement TGVmax depuis n'importe quelle gare,
- à n'importe quelle date. Open data, open source, sans pub.
+ Trouvez où partir avec votre abonnement TGVmax — devenu MAX JEUNE — depuis n'importe
+ quelle gare, à n'importe quelle date. Open data, open source, sans pub.