Skip to content

seo: link plugin logos to group page + fix dead EE redirect rules#4969

Open
vfanucci wants to merge 2 commits into
mainfrom
seo/fix-plugin-redirect-links
Open

seo: link plugin logos to group page + fix dead EE redirect rules#4969
vfanucci wants to merge 2 commits into
mainfrom
seo/fix-plugin-redirect-links

Conversation

@vfanucci

@vfanucci vfanucci commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Context

Technical SEO audit (Screaming Frog, 2026-06-15): ~1,207 internal links point to URLs that return a 301, concentrated on /use-cases/* and /features/*. Source = the plugin logo carousels.

Root cause

The three logo components build links as /plugins/${artifactId}/${name}. For ~82 plugins the /${name} subgroup URL does not exist (404) and the middleware (notFoundRedirect) 301-redirects it to the group page /plugins/${artifactId}. Each affected logo is a wasted 404→301 hop (×105 for the 4 most frequent: airtable-record, argo-cd-apps, ansible-cli, airflow-dags).

Note: 385 /plugins/plugin-X/name subgroup pages do exist (200). Since these are decorative logo links, all logos now point at the group page (always 200) — the semantically correct destination for a logo, with no redirect. If the team prefers to keep deep-links for the 385 valid ones, the name → slug mapping should instead be made reliable in the plugin metadata.

Changes

  • PluginsBlock.astro, EveryPlugin.astro, PluginsBox.astro: logo link → /plugins/${artifactId}.
  • src/contents/redirects/plugins.yml: the middleware applies the first matching rule (allEntries[0]). The catch-all /plugins/plugin-([^/]+).* was placed before the specific EE rules (aws/azure/gcp/kubernetes runner), so those never fired. Moved the catch-all to the end, fixed a leading-space typo in the plugin-azure rule, and pointed the EE rules directly at their final 200 URL (adding the aws-batch-task-runner / azure-runner / google-cloud-task-runner subgroup) so reactivating them is a single 301, not a chain.

Verified

  • Group destinations /plugins/plugin-{airtable,argocd,ansible,airflow,trello,jira,microsoft-fabric} confirmed 200 in the crawl.
  • All EE rule targets confirmed 200 in a single hop live.
  • plugins.yml validated (YAML parses, catch-all last, no leading-space rule).

🤖 Generated with Claude Code

The plugin logo carousels (PluginsBlock, EveryPlugin, PluginsBox) built links
as `/plugins/${artifactId}/${name}`. For ~82 plugins the `/${name}` subgroup
URL does not exist (404) and the middleware catch-all 301-redirects it to the
group page `/plugins/${artifactId}`. Screaming Frog flagged ~1,200 internal
links pointing to these redirects, concentrated on /use-cases/* and /features/*.

Since these are decorative logo links, point them straight at the plugin group
page (always 200) to remove the 404 -> 301 hop.

Also reorder src/contents/redirects/plugins.yml: the middleware applies the
FIRST matching rule (notFoundRedirect -> allEntries[0]), so the catch-all
`/plugins/plugin-([^/]+).*` placed before the specific EE batch/cloudrun rules
made those rules dead. Moved the catch-all to the end and fixed a leading-space
typo in the plugin-azure rule that prevented it from ever matching.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

☁️ Cloudflare Worker Preview Deployed!

🔗 https://ks-seo-fix-plugin-redirect-links-docs.kestra-io.workers.dev
🔗 https://9ee8cf41-docs.kestra-io.workers.dev

## 🔦 Lighthouse Benchmark

Tested: https://ks-seo-fix-plugin-redirect-links-docs.kestra-io.workers.dev on 2026-06-16 14:07 UTC
No baseline available — scores will appear after the first merge to main

Scores (0–100, higher is better)

Page Performance Accessibility Best Practices SEO
Home 70 83 56 92
Pricing 99 91 56 100
Enterprise 96 82 56 100
Cloud 92 87 56 100
About Us 84 91 56 100
Docs Landing 93 88 56 92
Contribute to Kestra (simple docs) 99 88 56 92
Flow (full featured docs) 96 90 56 92
Blog Index 60 91 56 100
Blog Post (sample) 93 87 56 100
VS Page (sample) 97 88 56 100
Plugins Landing 91 81 56 92
Plugin Page (sample) 94 87 56 100
Plugin Debug Page (sample) 93 87 56 100
Plugin Debug Return Page (sample) 86 88 56 100
Blueprints Landing 94 80 56 92
Blueprint Audit Logs CSV Export 71 86 56 100

Core Web Vitals (lower is better)

Page LCP FCP TBT CLS Speed Index
Home 1.52 s 0.74 s 458 ms 0.000 2.30 s
Pricing 0.86 s 0.59 s 18 ms 0.005 0.90 s
Enterprise 1.40 s 0.57 s 17 ms 0.000 0.84 s
Cloud 1.75 s 0.57 s 24 ms 0.000 0.91 s
About Us 2.85 s 0.65 s 34 ms 0.000 0.91 s
Docs Landing 1.12 s 0.56 s 186 ms 0.000 1.01 s
Contribute to Kestra (simple docs) 0.97 s 0.55 s 62 ms 0.000 0.86 s
Flow (full featured docs) 0.96 s 0.56 s 111 ms 0.000 1.29 s
Blog Index 5.86 s 1.34 s 145 ms 0.000 30.48 s
Blog Post (sample) 1.67 s 0.57 s 25 ms 0.000 0.86 s
VS Page (sample) 1.07 s 0.58 s 12 ms 0.064 0.75 s
Plugins Landing 1.18 s 0.62 s 57 ms 0.000 2.65 s
Plugin Page (sample) 1.14 s 0.50 s 103 ms 0.051 1.63 s
Plugin Debug Page (sample) 0.96 s 0.57 s 141 ms 0.001 1.71 s
Plugin Debug Return Page (sample) 1.14 s 0.61 s 223 ms 0.025 2.15 s
Blueprints Landing 1.33 s 0.75 s 31 ms 0.000 1.61 s
Blueprint Audit Logs CSV Export 1.13 s 0.57 s 138 ms 0.485 2.03 s
Legend

🟢 improved  ·  🔻 regressed  ·  (blank) no significant change
Score threshold: ±10 pts  ·  Metric threshold: ±30% of baseline

Verified live: the EE rule targets (e.g. /plugins/plugin-ee-aws/io.kestra.
plugin.ee.aws.runner.batch) themselves 301 to a subgroup URL. Now that the
catch-all is reordered last, these rules fire again — so point them straight at
the final 200 URL (adding the aws-batch-task-runner / azure-runner /
google-cloud-task-runner subgroup) to keep it a single 301 instead of a chain.
Kubernetes already resolves 200 directly and is unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant