From 6cbb4531fe78353897f41bddbdee2987e45d4bb6 Mon Sep 17 00:00:00 2001 From: Radin Hamidi Rad Date: Wed, 29 Apr 2026 23:25:30 -0400 Subject: [PATCH 1/2] Top-menu linkouts use new tab; footer/in-page stay same-tab Refined behavior per user feedback: - Top nav linkout items (Dashboard, Leaderboard, Docs on the marketing site; Toolkit on the leaderboard) now open in a new tab. Rationale: users navigating the menu bar are mid-task on the current page; sibling-site jumps shouldn't blow away their context. - Footer and in-page linkouts stay same-tab. Footer is rarely read at the top of attention; in-page references already get middle-click for new tab if the reader wants one. Implemented via the existing Header `newTab` prop (separate from `external` which only renders the icon). external + newTab are intentionally orthogonal so we can vary them per surface. Co-Authored-By: Claude Opus 4.7 (1M context) --- reproducibility/site/src/layouts/Default.astro | 5 +++-- web/site/src/layouts/Default.astro | 13 +++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/reproducibility/site/src/layouts/Default.astro b/reproducibility/site/src/layouts/Default.astro index 3a001a9..0ba8afa 100644 --- a/reproducibility/site/src/layouts/Default.astro +++ b/reproducibility/site/src/layouts/Default.astro @@ -11,13 +11,14 @@ interface Props { const { title, description } = Astro.props; -// External links render the linkout icon and open in the current tab. +// Top-menu linkout items (external: true) open in a new tab so the user +// keeps their place on the leaderboard when they cross to a sibling site. const navLinks = [ { label: "Datasets", href: "/datasets/" }, { label: "Methods", href: "/methods/" }, { label: "Models", href: "/models/" }, { label: "About", href: "/about" }, - { label: "Toolkit", href: "https://querygym.com", external: true }, + { label: "Toolkit", href: "https://querygym.com", external: true, newTab: true }, ]; --- diff --git a/web/site/src/layouts/Default.astro b/web/site/src/layouts/Default.astro index 18779c4..9d06fd2 100644 --- a/web/site/src/layouts/Default.astro +++ b/web/site/src/layouts/Default.astro @@ -33,17 +33,18 @@ const SITE = "https://querygym.com"; const canonical = new URL(Astro.url.pathname, SITE).toString(); const ogImageAbsolute = new URL(ogImage, SITE).toString(); -// External links use `external: true` (renders the linkout icon) and open in -// the *current* tab — opening a new tab silently is a worse UX than letting -// the user middle-click / cmd-click when they want a tab. +// Top-menu linkout items (external: true) open in a new tab so the user +// keeps their place on querygym.com when they leave to a sibling site. +// Everywhere else on the page (footer, hero CTAs, ecosystem cards, in-page +// citations) stays same-tab unless explicitly noted. const navLinks = [ { label: "Install", href: "/install" }, { label: "Methods", href: "/methods" }, { label: "Reproducibility", href: "/reproducibility" }, { label: "Cite", href: "/cite" }, - { label: "Docs", href: "https://querygym.readthedocs.io", external: true }, - { label: "Leaderboard", href: "https://leaderboard.querygym.com", external: true }, - { label: "Dashboard", href: "https://dashboard.querygym.com", external: true }, + { label: "Docs", href: "https://querygym.readthedocs.io", external: true, newTab: true }, + { label: "Leaderboard", href: "https://leaderboard.querygym.com", external: true, newTab: true }, + { label: "Dashboard", href: "https://dashboard.querygym.com", external: true, newTab: true }, ]; const fullTitle = `${title} — QueryGym`; From f5aba776e48a432ec21e0f04337e6d2a98dde718 Mon Sep 17 00:00:00 2001 From: Radin Hamidi Rad Date: Wed, 29 Apr 2026 23:29:46 -0400 Subject: [PATCH 2/2] Alias /sitemap.xml -> /sitemap-index.xml on both sites MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Google Search Console's "Add a sitemap" form auto-suggests /sitemap.xml when you start typing — and a lot of other tools (Bing, Yandex, IndexNow probes, humans) try /sitemap.xml first. @astrojs/sitemap only emits /sitemap-index.xml + /sitemap-0.xml, so /sitemap.xml was 404'ing on both querygym.com and leaderboard.querygym.com. That's the most likely cause of the GSC "Couldn't fetch" reports — the sitemap-index URL itself is fine. Fix: add a 200 rewrite (not a 301 redirect) in each project's _redirects so /sitemap.xml serves the index content directly. The 200 keeps the canonical URL stable for crawlers that already know about /sitemap-index.xml; new submitters can use either form. Verified locally: both build outputs include the rewrite rules in dist/_redirects. After deploy, retry GSC submission with whichever URL you prefer: https://querygym.com/sitemap.xml https://querygym.com/sitemap-index.xml https://leaderboard.querygym.com/sitemap.xml https://leaderboard.querygym.com/sitemap-index.xml Note: GSC "Couldn't fetch" status is also commonly transient for the first 24-48h while Google gets around to crawling. If the URL returns 200 in a browser, the submission is healthy. Also includes the orphaned-from-PR-#16 commit: "Top-menu linkouts use new tab; footer/in-page stay same-tab" which got pushed after that PR's merge. Co-Authored-By: Claude Opus 4.7 (1M context) --- reproducibility/site/public/_redirects | 4 ++++ web/site/public/_redirects | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/reproducibility/site/public/_redirects b/reproducibility/site/public/_redirects index d375bd3..19a8dd2 100644 --- a/reproducibility/site/public/_redirects +++ b/reproducibility/site/public/_redirects @@ -2,3 +2,7 @@ # leaderboard.querygym.com. /leaderboard / 301 /index.html / 301 + +# Alias /sitemap.xml -> /sitemap-index.xml (200 = rewrite, not redirect). +# GSC and other crawlers default to probing /sitemap.xml. +/sitemap.xml /sitemap-index.xml 200 diff --git a/web/site/public/_redirects b/web/site/public/_redirects index 8314cd8..f390ca8 100644 --- a/web/site/public/_redirects +++ b/web/site/public/_redirects @@ -6,3 +6,10 @@ /leaderboard https://leaderboard.querygym.com/ 301 /leaderboard.html https://leaderboard.querygym.com/ 301 /QueryGym/* https://querygym.com/:splat 301 + +# Alias the canonical /sitemap.xml path to the @astrojs/sitemap-generated +# index. Google Search Console's "Add a sitemap" form auto-suggests +# /sitemap.xml; tools like Bing/Yandex/IndexNow probe it; humans type it. +# The 200 status is a rewrite (URL stays the same in the browser), not a +# redirect — keeps the canonical URL for crawlers stable. +/sitemap.xml /sitemap-index.xml 200