Conversation
…ts.txt and sitemap.xml, and integrate react-helmet-async for dynamic page titles and descriptions in showcase pages.
There was a problem hiding this comment.
Code Review
This pull request enhances SEO and documentation by integrating react-helmet-async, adding robots.txt and sitemap.xml, and updating the README.md. It also refines a useEffect dependency in the editor. Feedback highlights an invalid package version for react-helmet-async, a typo in the documentation, and the need to localize hardcoded French SEO metadata to maintain multilingual support.
| <title>SetRsoft – Éditeur 3D Bouldering en ligne</title> | ||
| <meta name="description" content="Éditeur 3D virtuel pour créer vos blocs d'escalade bouldering. Simulation, routesetting, partage de séquences." /> | ||
| <script type="application/ld+json">{JSON.stringify({ | ||
| "@context": "https://schema.org", | ||
| "@type": "SoftwareApplication", | ||
| "name": "SetRsoft", | ||
| "applicationCategory": "SportsApplication", | ||
| "operatingSystem": "Web", | ||
| "description": "Éditeur 3D de blocs d'escalade bouldering en ligne. Routesetting virtuel.", | ||
| "url": "https://setrsoft.com", | ||
| "offers": { "@type": "Offer", "price": "0" } | ||
| })}</script> |
| <title>Contact – SetRsoft</title> | ||
| <meta name="description" content="Contactez l'équipe SetRsoft pour intégrer l'éditeur 3D dans votre salle d'escalade bouldering." /> |
| <title>Partenaires – SetRsoft</title> | ||
| <meta name="description" content="Salles d'escalade partenaires de SetRsoft, logiciel de routesetting 3D bouldering." /> |
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Adds basic SEO artifacts (sitemap/robots) and page-level metadata management to improve discoverability of the frontend SPA.
Changes:
- Add
sitemap.xmlandrobots.txtunderfrontend/public/. - Introduce
react-helmet-async(HelmetProvider+ per-page<Helmet>tags) to set titles/descriptions and JSON-LD. - Minor fixes/adjustments: editor analytics effect deps, update a dataset link, update default
index.htmlmetadata, README link text.
Reviewed changes
Copilot reviewed 10 out of 11 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| frontend/src/main.tsx | Wrap app in HelmetProvider to enable runtime head management. |
| frontend/src/features/showcase/HomePage.tsx | Add Helmet title/description + JSON-LD; update dataset link. |
| frontend/src/features/showcase/PartnersPage.tsx | Add Helmet title/description. |
| frontend/src/features/showcase/ContactPage.tsx | Add Helmet title/description. |
| frontend/src/features/editor/EditorApp.tsx | Fix useEffect dependency list; whitespace cleanup. |
| frontend/public/sitemap.xml | Add static sitemap entries for key marketing pages. |
| frontend/public/robots.txt | Add crawl rules + sitemap reference. |
| frontend/package.json | Add react-helmet-async dependency. |
| frontend/package-lock.json | Lockfile updates for new dependency tree. |
| frontend/index.html | Update default title/meta/OG tags + canonical. |
| README.md | Add a link to YouTube search results for context. |
Files not reviewed (1)
- frontend/package-lock.json: Language not supported
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| <Helmet> | ||
| <title>SetRsoft – Éditeur 3D Bouldering en ligne</title> | ||
| <meta name="description" content="Éditeur 3D virtuel pour créer vos blocs d'escalade bouldering. Simulation, routesetting, partage de séquences." /> | ||
| <script type="application/ld+json">{JSON.stringify({ |
There was a problem hiding this comment.
The page <title> and meta description are hard-coded in French, while the rest of the page is localized via i18next. This will show French metadata even when the active language is English/DE/etc; consider sourcing these values from translation keys (e.g., t('seo.home.title'), t('seo.home.description')) and adding those keys to each locale JSON.
| <script type="application/ld+json">{JSON.stringify({ | ||
| "@context": "https://schema.org", | ||
| "@type": "SoftwareApplication", | ||
| "name": "SetRsoft", | ||
| "applicationCategory": "SportsApplication", | ||
| "operatingSystem": "Web", | ||
| "description": "Éditeur 3D de blocs d'escalade bouldering en ligne. Routesetting virtuel.", | ||
| "url": "https://setrsoft.com", | ||
| "offers": { "@type": "Offer", "price": "0" } | ||
| })}</script> |
There was a problem hiding this comment.
This structured-data <script> is created inline with JSON.stringify(...) on every render. Consider hoisting the JSON-LD object/string outside the component or memoizing it to avoid unnecessary work during re-renders (especially if the component state updates).
| <Helmet> | ||
| <title>Partenaires – SetRsoft</title> | ||
| <meta name="description" content="Salles d'escalade partenaires de SetRsoft, logiciel de routesetting 3D bouldering." /> | ||
| </Helmet> |
There was a problem hiding this comment.
The page <title> and meta description are hard-coded in French even though the UI text uses i18next translations. To avoid incorrect language metadata for non-FR users/crawlers, consider using translated values (new i18n keys per locale) instead of hard-coded strings.
| <title>Contact – SetRsoft</title> | ||
| <meta name="description" content="Contactez l'équipe SetRsoft pour intégrer l'éditeur 3D dans votre salle d'escalade bouldering." /> |
There was a problem hiding this comment.
The page <title> and meta description are hard-coded in French even though the UI text uses i18next translations. To avoid incorrect language metadata for non-FR users/crawlers, consider using translated values (new i18n keys per locale) instead of hard-coded strings.
| <title>Contact – SetRsoft</title> | |
| <meta name="description" content="Contactez l'équipe SetRsoft pour intégrer l'éditeur 3D dans votre salle d'escalade bouldering." /> | |
| <title>{t('contact.metaTitle')}</title> | |
| <meta name="description" content={t('contact.metaDescription')} /> |
| User-agent: * | ||
| Allow: / | ||
| Disallow: /editor/ | ||
| Disallow: /gym/ |
There was a problem hiding this comment.
Disallow: /gym/ will not match the /gym route (no trailing slash) used by the router, so crawlers may still index the gym dashboard. Consider changing this to Disallow: /gym (and similarly decide whether /editor itself should be blocked in addition to /editor/*).
| Disallow: /gym/ | |
| Disallow: /gym |
| <title>SetRsoft – Éditeur 3D de blocs d'escalade bouldering</title> | ||
| <meta name="description" content="SetRsoft est un éditeur 3D en ligne pour créer des blocs et voies d'escalade bouldering. Routesetting virtuel, simulation 3D, partage de séquences." /> | ||
| <meta name="keywords" content="éditeur 3D escalade, bouldering editor, routesetting en ligne, créer voie escalade, virtual climbing wall, bloc escalade 3D" /> | ||
| <meta property="og:title" content="SetRsoft – Éditeur 3D escalade bouldering" /> | ||
| <meta property="og:description" content="Créez et partagez vos blocs d'escalade en 3D. Éditeur virtuel bouldering en ligne." /> |
There was a problem hiding this comment.
These default SEO tags in index.html are hard-coded in French, but the app is configured for multiple locales (i18next with fallbackLng=en). If you expect non-FR users/SEO, consider making the default metadata language-neutral/English, or add a prerender/SSR strategy so metadata can be emitted per-locale rather than relying on a single static index.html.
| <title>SetRsoft – Éditeur 3D de blocs d'escalade bouldering</title> | |
| <meta name="description" content="SetRsoft est un éditeur 3D en ligne pour créer des blocs et voies d'escalade bouldering. Routesetting virtuel, simulation 3D, partage de séquences." /> | |
| <meta name="keywords" content="éditeur 3D escalade, bouldering editor, routesetting en ligne, créer voie escalade, virtual climbing wall, bloc escalade 3D" /> | |
| <meta property="og:title" content="SetRsoft – Éditeur 3D escalade bouldering" /> | |
| <meta property="og:description" content="Créez et partagez vos blocs d'escalade en 3D. Éditeur virtuel bouldering en ligne." /> | |
| <title>SetRsoft – 3D bouldering route editor</title> | |
| <meta name="description" content="SetRsoft is an online 3D editor for creating bouldering problems and climbing routes. Virtual routesetting, 3D simulation, and sequence sharing." /> | |
| <meta name="keywords" content="3D climbing editor, bouldering editor, online routesetting, create climbing route, virtual climbing wall, 3D bouldering" /> | |
| <meta property="og:title" content="SetRsoft – 3D bouldering route editor" /> | |
| <meta property="og:description" content="Create and share your 3D climbing problems online with a virtual bouldering editor." /> |
|
|
||
| SetRsoft is an open source community driven software. Test it live on the website http://www.setrsoft.com/ | ||
|
|
||
| For better understanding the purpose of this project you can have a look at [one of those videos](https://www.youtube.com/results?search_query=routesetting+in+climbing+gym). |
There was a problem hiding this comment.
Spelling/grammar: "puropose" is misspelled, and the sentence reads ungrammatically ("have a look to"). Consider updating to "For a better understanding of the purpose of this project, you can have a look at one of these videos ...".
| For better understanding the purpose of this project you can have a look at [one of those videos](https://www.youtube.com/results?search_query=routesetting+in+climbing+gym). | |
| For a better understanding of the purpose of this project, you can have a look at [one of those videos](https://www.youtube.com/results?search_query=routesetting+in+climbing+gym). |
| <?xml version="1.0" encoding="UTF-8"?> | ||
| <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> | ||
| <url> | ||
| <loc>https://setrsoft.com/</loc> | ||
| <changefreq>weekly</changefreq> | ||
| <priority>1.0</priority> |
There was a problem hiding this comment.
The PR title suggests this change only adds a sitemap, but this PR also introduces runtime SEO metadata via react-helmet-async (HelmetProvider + per-page meta) and updates robots.txt/README/links. Consider updating the PR title/description to reflect the broader SEO scope so reviewers know what to focus on.
No description provided.