feat: Adopter Stories#1279
Conversation
- Add per-page meta descriptions (140-160 chars) on key pages - Retitle authorization-concepts page for SEO - Fix homepage H1 by removing SVG <title> leak (HeroLogo) - Install @stackql/docusaurus-plugin-structured-data - Emit Organization (CNCF/Linux Foundation), WebSite + SearchAction, BreadcrumbList, and SoftwareApplication JSON-LD - Add FAQPage JSON-LD to authorization-concepts (7 entries) - Add HowTo JSON-LD to getting-started overview (9 steps)
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (49)
WalkthroughThis PR substantially expands OpenFGA's documentation with adopter case studies, industry-specific authorization guides, learning resources on authorization concepts, and use-case patterns. It also enhances site SEO through JSON-LD structured data, breadcrumbs, and robots.txt, reorganizes navigation with new sidebar sections, and improves frontend accessibility via ARIA attributes and secure link attributes. ChangesDocumentation Content Expansion
SEO, Metadata, and Site Configuration
🎯 4 (Complex) | ⏱️ ~60 minutes Possibly Related PRs
Suggested Reviewers
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
⚔️ Resolve merge conflicts
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
Adds SEO/crawlability improvements and expands documentation content/structure for OpenFGA docs and landing pages.
Changes:
- Added robots.txt + expanded llms.txt content, and updated llms.txt generation to respect doc frontmatter slugs.
- Added structured data (JSON-LD) for site, breadcrumbs, software app, and select docs pages; added targeted noindex for time-sensitive blog posts.
- Expanded docs IA with new “Learn”, “Use Cases”, “Industries”, and “Adopters” sections and updated sidebars/links accordingly.
Reviewed changes
Copilot reviewed 48 out of 49 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| static/robots.txt | Introduces crawler directives and sitemap reference. |
| static/llms.txt | Updates generated documentation map and adds new sections/links for LLM consumption. |
| src/theme/Root.tsx | Adds JSON-LD (site + breadcrumbs) and noindex for specific blog posts. |
| src/theme/NotFound.tsx | Hardens external link by adding rel="noopener noreferrer". |
| src/pages/index.tsx | Adds Software/SourceCode JSON-LD and updates landing page meta description. |
| src/features/LandingPage/HeroHeader/index.tsx | Improves H1 accessibility by adding visually-hidden “OpenFGA” text. |
| src/features/LandingPage/HeroHeader/HeroLogo.tsx | Makes logo decorative for screen readers (aria-hidden) and removes <title>. |
| src/features/LandingPage/FeaturesSection/index.tsx | Adds rel="noopener noreferrer" to external links opened in new tabs. |
| scripts/generate-llms-txt.mjs | Builds a docID→URL map using frontmatter slug and generates updated llms.txt sections. |
| docusaurus.config.js | Enables docs “last update time” and enhances OG/Twitter metadata. |
| docs/sidebars.js | Adds new sidebar categories: Industries, Use Cases, Adopters, Learn. |
| docs/content/use-cases/rag-authorization.mdx | Adds new “RAG Authorization” use case page. |
| docs/content/use-cases/overview.mdx | Adds Use Cases landing page. |
| docs/content/use-cases/multi-tenant-saas.mdx | Adds “Multi-Tenant SaaS Authorization” use case page. |
| docs/content/use-cases/microservices-authorization.mdx | Adds “Microservices Authorization” use case page. |
| docs/content/use-cases/mcp-server-authorization.mdx | Adds “MCP Server Authorization” use case page. |
| docs/content/use-cases/ai-agent-authorization.mdx | Adds “AI Agent Authorization” use case page. |
| docs/content/modeling/agents/rag-authorization.mdx | Updates description for SEO/clarity. |
| docs/content/modeling/agents/overview.mdx | Updates description for SEO/clarity. |
| docs/content/modeling/agents/mcp-authorization.mdx | Updates description for SEO/clarity. |
| docs/content/learn/zanzibar.mdx | Adds new Learn page about Zanzibar. |
| docs/content/learn/rebac.mdx | Adds new Learn page about ReBAC. |
| docs/content/learn/rbac-vs-rebac.mdx | Adds new Learn comparison page. |
| docs/content/learn/policy-engine.mdx | Adds new Learn page comparing policy vs relationship engines. |
| docs/content/learn/overview.mdx | Adds Learn landing page. |
| docs/content/learn/fine-grained-authorization.mdx | Adds new Learn page about fine-grained authorization. |
| docs/content/learn/abac-vs-rebac.mdx | Adds new Learn comparison page. |
| docs/content/intro.mdx | Expands intro resources to include Use Cases/Industries/Learn. |
| docs/content/industries/overview.mdx | Adds Industries landing page. |
| docs/content/industries/lms.mdx | Adds LMS/EdTech industry page. |
| docs/content/industries/human-resources.mdx | Adds HR/HRIS industry page. |
| docs/content/industries/healthcare.mdx | Adds Healthcare industry page. |
| docs/content/industries/ecommerce.mdx | Adds E-commerce industry page. |
| docs/content/industries/crm.mdx | Adds CRM industry page. |
| docs/content/industries/banking.mdx | Adds Banking/Fintech industry page. |
| docs/content/industries/applicant-tracking-system.mdx | Adds ATS/Recruiting industry page. |
| docs/content/getting-started/setup-openfga/configuration.mdx | Updates server config options reference to newer OpenFGA version/options. |
| docs/content/getting-started/overview.mdx | Adds structured data (HowTo JSON-LD) and improves page description. |
| docs/content/authorization-concepts.mdx | Adds FAQPage JSON-LD and rewrites/updates conceptual content + links. |
| docs/content/adopters/zuplo.mdx | Adds Zuplo adopter case study page. |
| docs/content/adopters/vitrolife.mdx | Adds Vitrolife adopter case study page. |
| docs/content/adopters/read-ai.mdx | Adds Read AI adopter case study page. |
| docs/content/adopters/overview.mdx | Adds Adopters landing page. |
| docs/content/adopters/openlane.mdx | Adds OpenLane adopter case study page. |
| docs/content/adopters/headspace.mdx | Adds Headspace adopter case study page. |
| docs/content/adopters/grafana.mdx | Adds Grafana Labs adopter case study page. |
| docs/content/adopters/docker.mdx | Adds Docker adopter case study page. |
| docs/content/adopters/agicap.mdx | Adds Agicap adopter case study page. |
| blog/fine-grained-news-2024-10.md | Minor formatting/indentation fix. |
Comments suppressed due to low confidence (6)
src/theme/Root.tsx:1
- Inline
<script>tags will be blocked by a typical CSP unlessscript-srcallows inline scripts (viaunsafe-inline) or the scripts carry an allowednonce/hash. Since this component explicitly sets a CSP meta tag, these JSON-LD scripts may silently not execute in production; consider adding a nonce to these script tags and ensuring the CSP includes it (preferred), or otherwise adjusting CSP in a controlled way.
src/theme/Root.tsx:1 - The word-splitting logic mixes underscore replacement with hyphen splitting (
replace(/[_]+/g, ' ').split('-')), which yields tokens containing spaces (e.g.,fine_grainedbecomes a single token\"fine grained\"). That produces incorrect breadcrumb names like\"Fine grained\"instead of\"Fine Grained\". Consider normalizing both_and-to spaces and splitting on whitespace (or splitting on both delimiters) before applying title-casing.
src/theme/Root.tsx:1 - If
siteConfig.urlis configured with a trailing slash (common in some Docusaurus setups),itemURLs will contain a double slash (e.g.,https://openfga.dev//docs/...). NormalizesiteUrl(trim trailing/) before interpolating, or use a URL join helper to ensure canonical breadcrumb URLs.
src/pages/index.tsx:1 - Injecting JSON into a
<script>tag is safer if you escape<(and ideally guard against</script>substrings) to prevent accidental script-tag termination if any fields ever become data-driven.Root.tsxalready uses.replace(/</g, '\\\\u003c')for this; consider applying the same escaping here for consistency and defense-in-depth.
scripts/generate-llms-txt.mjs:1 - The frontmatter parser hard-codes
\\nline endings, so it will fail to detect frontmatter on files using CRLF (\\r\\n). That will silently drop slug overrides and generate incorrect URLs. Consider updating the regex to accept\\r?\\nand/or using a small frontmatter parser to robustly handle common formatting variations.
src/features/LandingPage/HeroHeader/index.tsx:1 - The inline visually-hidden style block is a fairly standard
sr-onlypattern and is likely to be reused elsewhere. Consider moving this to a shared CSS utility class (or an existingsr-onlyclass if the site already has one) to reduce duplication and make future accessibility tweaks easier.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| Fine-Grained Authorization (FGA) means deciding access at the level of the individual resource and action — *"Alice can edit document-42"*, not just *"Alice is an editor"*. Well-designed FGA systems handle millions of objects and users with permissions that change rapidly, like Google Drive's per-document and per-folder sharing. | ||
|
|
||
| A notable example of FGA is Google Drive: access can be granted either to documents or to folders, as well as to individual users or users as a group, and access rights regularly change as new documents are created and shared with specific users or groups. | ||
| See [Fine-Grained Authorization](./learn/fine-grained-authorization.mdx) for the full explanation. |
| In [Role-Based Access Control](https://en.wikipedia.org/wiki/Role-based_access_control) (RBAC), permissions are assigned to users based on roles like `editor` or `admin`. RBAC fits flat, single-tenant access models but breaks down with hierarchy, sharing, or multi-tenancy. | ||
|
|
||
| RBAC systems enable you to define users, groups, roles, and permissions, then store them in a centralized location. Applications access that information to make authorization decisions. | ||
| See [RBAC vs. ReBAC](./learn/rbac-vs-rebac.mdx) for when roles run out and how <ProductName format={ProductNameFormat.ShortForm}/> models RBAC cleanly. |
| In [Attribute-Based Access Control](https://en.wikipedia.org/wiki/Attribute-based_access_control) (ABAC), permissions are granted based on attributes of the user, resource, or request — for example, a user with `marketing` and `manager` attributes can publish marketing posts. ABAC implementations typically pull attributes from multiple sources at decision time. | ||
|
|
||
| Applications implementing ABAC need to retrieve information stored in multiple data sources - like RBAC services, user directories, and application-specific data sources - to make authorization decisions. | ||
| See [ABAC vs. ReBAC](./learn/abac-vs-rebac.mdx) for how the two combine. |
Description
What problem is being solved?
How is it being solved?
What changes are made to solve it?
References
Review Checklist
mainSummary by CodeRabbit
Documentation
Improvements