docs: on-site GEO improvements from the 2026-07-07 audit (#64)
## Description
Applies every on-site action from the fresh GEO audit (overall 72/100,
up from 62 on Jul 2 — see `GEO-AUDIT-REPORT.md`, updated in this PR).
Off-site actions (awesome-crowdsec PR, community threads, Wikidata
enrichment, YouTube) are intentionally out of scope. Also adds the
language selector to the mobile header per review feedback.
## Type of change
- [x] 📖 Documentation update
- [x] ✨ New feature (non-breaking change that adds functionality)
## Changes
- **Visible authorship (E-E-A-T high)**: "Maintained by José Manuel
Requena Plens" footer byline + new About page (en/es) with maintainer
links, third-party listings (CrowdSec Hub, Wikidata, pkg.go.dev, GHCR),
and a tested-with matrix (RB5009UG+S+, RouterOS 7.22.1, CrowdSec 1.5+,
Go 1.26.4)
- **Schema**: TechArticle `image` + git-derived `datePublished`;
`APIReference` typing for the 7 reference pages; `Dataset` for the
RB5009 benchmarks (localized); FAQPage `@id`/`inLanguage`/`isPartOf`;
SoftwareApplication `softwareHelp`, `softwareRequirements`, real
dashboard screenshot; Person `description`; WebSite `inLanguage:
["en","es"]` (a fix lost during the i18n round, spotted live by the
audit)
- **Citability**: Quick Start direct-answer lead + prerequisites block +
question-form headings; Installation decision-rule intro; quantified
"defaults work well"; methodology anchors for the 97× and 200–500x
claims; self-contained API-key note
- **Outbound authority links**: CrowdSec bouncers docs, RouterOS
firewall docs
- **Meta/technical**: 46 descriptions expanded to ~120–165 chars (they
were breaking YAML until quoted); `twitter:title/description`;
`og:image` width/height/alt; `x-default` in sitemap hreflang alternates;
IndexNow HTTP result surfaced in the CI job summary
- **Mobile UX**: language selector now visible in the header below the
50rem breakpoint (was buried at the bottom of the menu drawer); other
right-group items stay hidden
- **Infra**: `latest-release.mjs` resolves the docs root via
`process.cwd()` — `import.meta.url` pointed into `dist/chunks/` under
Vite SSR bundling, which silently broke git lookups for bundled
consumers
## Testing
- [x] Documentation checks pass (`pnpm analyze`: astro check 0 errors,
eslint, prettier, build 57 pages, html-validate)
- [x] 102 internal links + anchors verified against the built HTML in
both locales; en/es structural parity holds on all 28 pages
- [x] JSON-LD verified in dist: APIReference, Dataset, datePublished
(real first-commit dates; correctly omitted for untracked pages), FAQ
@id, softwareHelp, inLanguage ["en","es"], 56 x-default sitemap
alternates
- [x] Mobile header verified with Playwright at 390×844 in both locales
(language select visible, no overlap with the hamburger)
- [ ] Unit tests (not applicable — docs/CI only)
- [ ] Tested against a real MikroTik router (not applicable)
## RouterOS compatibility
Not applicable — no runtime behavior changes.
## Checklist
- [x] My code follows the project style guidelines
- [ ] I have added tests for my changes (not applicable)
- [x] I have updated the documentation (if applicable)
- [ ] I have updated CHANGELOG.md (docs/CI-only change)
- [x] My changes do not introduce new warnings
https://claude.ai/code/session_01DqSrSogARwnqPjVcJWYAXb
## Summary by Sourcery
Apply on-site GEO audit improvements to the docs site and mobile header.
Enhancements:
- Add visible maintainer attribution via footer byline and new bilingual
About page with external listings and tested-with matrix.
- Upgrade structured data by typing reference pages as APIReference,
adding TechArticle images and git-derived datePublished, and introducing
a Dataset node for RB5009 benchmarks.
- Enrich global JSON-LD (Person description, WebSite inLanguage,
SoftwareApplication screenshot, softwareHelp, and softwareRequirements)
and FAQPage IDs and linkage.
- Improve AI- and search-facing metadata, including extended page
descriptions, Twitter meta tags, OG image dimensions/alt text, sitemap
x-default hreflang, and more precise configuration/architecture copy.
- Refine quickstart and installation docs with prerequisite blocks,
direct-answer intros, clarified deployment guidance, and CrowdSec docs
citations, plus stronger outbound authority links to RouterOS
documentation.
- Expose the language selector in the mobile header while keeping other
right-group items hidden on small screens.
- Fix git-based utilities by resolving the docs root from process.cwd()
and adding first-commit date lookup for datePublished, and surface
IndexNow results in GitHub Actions job summaries.
Documentation:
- Update GEO audit report with the July 7 re-audit, new scores, and
revised action plan.
docs: Spanish locale, documentation audit fixes, and dependency updates (#63)
## Description
Three related pieces of work on the documentation and tooling:
1. **Spanish (es) locale** for the Starlight docs site — full
translation of all 27 pages, following the same i18n pattern as
gitlab-mcp-server.
2. **Documentation audit fixes** — a docs-vs-code audit found
inaccuracies (wrong Prometheus label names, a fictional bulk-script
name, a TLS troubleshooting remedy that targeted the wrong subsystem,
stale Grafana dashboard inventory, broken README screenshots, etc.). All
confirmed against the source and fixed in both languages.
3. **Dependency updates** — Go tooling, docs packages, and pnpm 11
pinning.
## Type of change
- [x] 📖 Documentation update
- [x] 🔒 Security / dependency update
- [x] 🧪 Tests / tooling / CI
## Changes
- Add `es` locale: 27 translated pages under `src/content/docs/es/`,
translated sidebar/badges, language switcher, sitemap `hreflang`
alternates, locale-aware JSON-LD (TechArticle/BreadcrumbList/HowTo),
localized footer, and a Languages section in `llms.txt`
- Prometheus reference: correct label names (`proto` not `ip_type`;
`operation` not `component`), real `group`/`param`/`value` schema for
`config_info`, document `last_operation_duration_seconds`,
`routeros_identity`, `bulk_add`/`bulk_remove`, `unchanged`
- README: fix broken Grafana screenshot paths, regenerate dashboard
inventory from `dashboard.json` (41 panels / 9 rows), sync metrics
table, fix Router Setup anchor
- Troubleshooting: RouterOS TLS errors now point at
`mikrotik.tls_insecure` (no CA-path option exists for the MikroTik
connection)
- Firewall docs: `block_output` `interface` + `interface_list` are ANDed
(no precedence); bulk script is `crowdsec-bulk-import` run by internal
id; `/health` is always served
- Homepage version badge now derives from the latest git tag at build
time (shared `src/lib/latest-release.mjs`, also used by the JSON-LD)
- Deps: gosec v2.27.1, golang.org/x/tools v0.47.0, golang.org/x/vuln
v1.5.0; astro 7.0.6, @astrojs/starlight 0.41.3, typescript-eslint
8.63.0; pin `packageManager: pnpm@11.10.0` and switch
`pnpm/action-setup` to `package_json_file` (was hardcoded `version: 10`)
## Testing
- [x] Unit tests pass (`go test ./...`)
- [x] Static analysis passes (`actionlint` on edited workflows;
eslint/prettier on docs)
- [x] Documentation checks pass (`pnpm analyze`: astro check, lint,
format, build 55 pages, html-validate)
- [ ] Tested against a real MikroTik router (not applicable — docs/CI
only)
- [ ] Docker image builds (not applicable — no Go source changes, only
go.mod tool deps)
Additionally verified: all 90 internal doc links + anchors resolve in
both languages, and en/es structural parity (headings/code fences) holds
on all 27 pages.
## RouterOS compatibility
Not applicable — no runtime behavior changes.
## Checklist
- [x] My code follows the project style guidelines
- [ ] I have added tests for my changes (not applicable)
- [x] I have updated the documentation (if applicable)
- [ ] I have updated CHANGELOG.md (docs/CI-only change; no
release-facing behavior)
- [ ] I have updated release/configuration files when behavior changed
(not applicable)
- [x] My changes do not introduce new warnings
https://claude.ai/code/session_01DqSrSogARwnqPjVcJWYAXb
<!-- This is an auto-generated description by cubic. -->
<a
href="https://cubic.dev/pr/jmrplens/cs-routeros-bouncer/pull/63?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Documentation**
* Expanded and clarified setup, configuration, monitoring, security, and
troubleshooting docs.
* Added a full Spanish documentation set, including getting started,
configuration, architecture, development, monitoring, and examples.
* Updated metrics and Grafana dashboard references with a broader set of
panels and metric details.
* **New Features**
* Added language-aware site content, including localized footer text and
Spanish navigation/support.
* Version badges now automatically show the latest release by default.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
docs: on-site GEO improvements from the 2026-07-07 audit (#64)
## Description
Applies every on-site action from the fresh GEO audit (overall 72/100,
up from 62 on Jul 2 — see `GEO-AUDIT-REPORT.md`, updated in this PR).
Off-site actions (awesome-crowdsec PR, community threads, Wikidata
enrichment, YouTube) are intentionally out of scope. Also adds the
language selector to the mobile header per review feedback.
## Type of change
- [x] 📖 Documentation update
- [x] ✨ New feature (non-breaking change that adds functionality)
## Changes
- **Visible authorship (E-E-A-T high)**: "Maintained by José Manuel
Requena Plens" footer byline + new About page (en/es) with maintainer
links, third-party listings (CrowdSec Hub, Wikidata, pkg.go.dev, GHCR),
and a tested-with matrix (RB5009UG+S+, RouterOS 7.22.1, CrowdSec 1.5+,
Go 1.26.4)
- **Schema**: TechArticle `image` + git-derived `datePublished`;
`APIReference` typing for the 7 reference pages; `Dataset` for the
RB5009 benchmarks (localized); FAQPage `@id`/`inLanguage`/`isPartOf`;
SoftwareApplication `softwareHelp`, `softwareRequirements`, real
dashboard screenshot; Person `description`; WebSite `inLanguage:
["en","es"]` (a fix lost during the i18n round, spotted live by the
audit)
- **Citability**: Quick Start direct-answer lead + prerequisites block +
question-form headings; Installation decision-rule intro; quantified
"defaults work well"; methodology anchors for the 97× and 200–500x
claims; self-contained API-key note
- **Outbound authority links**: CrowdSec bouncers docs, RouterOS
firewall docs
- **Meta/technical**: 46 descriptions expanded to ~120–165 chars (they
were breaking YAML until quoted); `twitter:title/description`;
`og:image` width/height/alt; `x-default` in sitemap hreflang alternates;
IndexNow HTTP result surfaced in the CI job summary
- **Mobile UX**: language selector now visible in the header below the
50rem breakpoint (was buried at the bottom of the menu drawer); other
right-group items stay hidden
- **Infra**: `latest-release.mjs` resolves the docs root via
`process.cwd()` — `import.meta.url` pointed into `dist/chunks/` under
Vite SSR bundling, which silently broke git lookups for bundled
consumers
## Testing
- [x] Documentation checks pass (`pnpm analyze`: astro check 0 errors,
eslint, prettier, build 57 pages, html-validate)
- [x] 102 internal links + anchors verified against the built HTML in
both locales; en/es structural parity holds on all 28 pages
- [x] JSON-LD verified in dist: APIReference, Dataset, datePublished
(real first-commit dates; correctly omitted for untracked pages), FAQ
@id, softwareHelp, inLanguage ["en","es"], 56 x-default sitemap
alternates
- [x] Mobile header verified with Playwright at 390×844 in both locales
(language select visible, no overlap with the hamburger)
- [ ] Unit tests (not applicable — docs/CI only)
- [ ] Tested against a real MikroTik router (not applicable)
## RouterOS compatibility
Not applicable — no runtime behavior changes.
## Checklist
- [x] My code follows the project style guidelines
- [ ] I have added tests for my changes (not applicable)
- [x] I have updated the documentation (if applicable)
- [ ] I have updated CHANGELOG.md (docs/CI-only change)
- [x] My changes do not introduce new warnings
https://claude.ai/code/session_01DqSrSogARwnqPjVcJWYAXb
## Summary by Sourcery
Apply on-site GEO audit improvements to the docs site and mobile header.
Enhancements:
- Add visible maintainer attribution via footer byline and new bilingual
About page with external listings and tested-with matrix.
- Upgrade structured data by typing reference pages as APIReference,
adding TechArticle images and git-derived datePublished, and introducing
a Dataset node for RB5009 benchmarks.
- Enrich global JSON-LD (Person description, WebSite inLanguage,
SoftwareApplication screenshot, softwareHelp, and softwareRequirements)
and FAQPage IDs and linkage.
- Improve AI- and search-facing metadata, including extended page
descriptions, Twitter meta tags, OG image dimensions/alt text, sitemap
x-default hreflang, and more precise configuration/architecture copy.
- Refine quickstart and installation docs with prerequisite blocks,
direct-answer intros, clarified deployment guidance, and CrowdSec docs
citations, plus stronger outbound authority links to RouterOS
documentation.
- Expose the language selector in the mobile header while keeping other
right-group items hidden on small screens.
- Fix git-based utilities by resolving the docs root from process.cwd()
and adding first-commit date lookup for datePublished, and surface
IndexNow results in GitHub Actions job summaries.
Documentation:
- Update GEO audit report with the July 7 re-audit, new scores, and
revised action plan.
chore(deps): update GitHub Actions, Go and pnpm/Astro dependencies (#57)
## Description
Consolidated dependency refresh across the three ecosystems: GitHub
Actions, Go modules and the docs pnpm/Astro workspace.
## Type of change
- [ ] 🐛 Bug fix (non-breaking change that fixes an issue)
- [ ] ✨ New feature (non-breaking change that adds functionality)
- [ ] 💥 Breaking change (fix or feature that would cause existing
functionality to change)
- [ ] 📖 Documentation update
- [x] 🔒 Security / dependency update
- [ ] 🧪 Tests / tooling / CI
- [ ] 🧹 Refactoring / code cleanup
- [ ] ⚡ Performance improvement
## Changes
- **GitHub Actions**: bump `actions/checkout` v6 → v7 across `ci.yml`,
`docs.yml`, `release.yml` (all other pinned actions were already at
their latest release).
- **Go**: `go get -u ./...` + `go mod tidy` — refreshes indirect deps
(mostly transitive to `crowdsecurity/crowdsec`) and tool deps (`gosec`,
`x/tools`, `x/vuln`) to latest minor/patch. No direct dependency needed
a major bump.
- **docs (pnpm/Astro)**: `astro` 6.4.8 → 7.0.4, `@astrojs/starlight`
0.40.0 → 0.41.1, `eslint-plugin-astro` 1.7.0 → 2.1.1 (majors), plus
minor/patch bumps for `eslint`, `globals`, `playwright`, `prettier`,
`typescript-eslint`. Also cleaned up a stray unfilled `allowBuilds`
placeholder that pnpm 11 had appended to `docs/pnpm-workspace.yaml`.
Supersedes dependabot PRs #52 (actions/checkout) and #54 (astro major);
those can be closed once this merges.
## Testing
- [x] Unit tests pass (`make test-short` or `make test`)
- [x] Static analysis passes (`make analyze` or equivalent CI jobs) —
`make lint`, `make gosec`, `make govulncheck` all clean. Note: `make
actionlint` fails on `.github/workflows/auto-assign.yml` (pre-existing
shellcheck warning from #56, unrelated to this branch).
- [x] Documentation checks pass (`make docs-analyze` if docs changed) —
`check`, `lint`, `format:check`, `build`, `html-validate` all pass on
Astro 7.
- [ ] Tested against a real MikroTik router (if applicable)
- [ ] Docker image builds (`make docker-build`)
## Checklist
- [x] My code follows the project style guidelines
- [ ] I have added tests for my changes (if applicable)
- [ ] I have updated the documentation (if applicable)
- [ ] I have updated CHANGELOG.md (if applicable)
- [ ] I have updated release/configuration files when behavior changed
- [x] My changes do not introduce new warnings
## Summary by Sourcery
Update dependencies across Go modules, GitHub Actions workflows, and the
docs pnpm/Astro workspace.
Build:
- Bump actions/checkout from v6 to v7 in CI, docs, and release GitHub
Actions workflows.
Documentation:
- Upgrade Astro docs dependencies, including Astro, @astrojs/starlight,
eslint-plugin-astro, and related tooling, and adjust pnpm workspace
config for built dependencies.
Chores:
- Refresh indirect Go module dependencies (including go-openapi, TOML,
Prometheus, gopsutil, and others) to newer minor/patch versions.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Chores**
* Updated CI and release workflows to use the latest repository checkout
action, helping keep build and test automation current.
* Refreshed several project dependencies and tooling versions, including
docs and linting packages, to improve maintenance and compatibility.
* Enabled builds for additional workspace components used by the docs
site, supporting smoother documentation builds and deployment.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->