Skip to content

Comments

feat: improve SEO with keywords and updating descriptions#211

Merged
sriramveeraghanta merged 2 commits intomasterfrom
improve-seo-with-keywords
Feb 23, 2026
Merged

feat: improve SEO with keywords and updating descriptions#211
sriramveeraghanta merged 2 commits intomasterfrom
improve-seo-with-keywords

Conversation

@sriramveeraghanta
Copy link
Member

@sriramveeraghanta sriramveeraghanta commented Feb 23, 2026

Description

  • Added Keywords
  • Updated Meta description

Type of Change

  • Improvement (change that would cause existing functionality to not work as expected)

Summary by CodeRabbit

  • Documentation
    • Enhanced API endpoint descriptions with explicit details about permanent deletions, cascading effects, and 204 success responses.
    • Expanded keywords and metadata across API reference, developer tools, and self-hosting documentation for improved discoverability.
    • Updated documentation titles and descriptions to provide clearer guidance for features like OAuth flows, webhooks, integrations, deployment methods, and license management.

@vercel
Copy link

vercel bot commented Feb 23, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
developer-docs Ready Ready Preview, Comment Feb 23, 2026 0:48am

Request Review

@coderabbitai
Copy link

coderabbitai bot commented Feb 23, 2026

📝 Walkthrough

Walkthrough

This pull request updates documentation across API reference, dev tools, and self-hosting sections. Changes include clarifying delete endpoint descriptions with explicit permanence language and success codes, expanding SEO keywords for improved discoverability, and refining metadata descriptions throughout.

Changes

Cohort / File(s) Summary
API Reference - Delete Endpoint Descriptions
docs/api-reference/customer/delete-customer.md, docs/api-reference/cycle/delete-cycle.md, docs/api-reference/inbox-issue/delete-inbox-issue.md, docs/api-reference/initiative/delete-initiative.md, docs/api-reference/intake-issue/delete-intake-issue.md, docs/api-reference/issue-attachments/delete-attachment.md, docs/api-reference/issue-comment/delete-issue-comment.md, docs/api-reference/issue/delete-issue.md, docs/api-reference/label/delete-label.md, docs/api-reference/module/delete-module.md, docs/api-reference/project/delete-project.md, docs/api-reference/state/delete-state.md, docs/api-reference/sticky/delete-sticky.md, docs/api-reference/worklogs/delete-worklog.md
Updated descriptions to explicitly state permanent deletion, enumerate affected resources, and specify 204 No Content response codes.
API Reference - Link Endpoints Keywords & Descriptions
docs/api-reference/link/add-link.md, docs/api-reference/link/delete-link.md, docs/api-reference/link/get-link-detail.md, docs/api-reference/link/list-links.md, docs/api-reference/link/overview.md, docs/api-reference/link/update-link-detail.md
Expanded keywords with operation-specific terms (create link, delete link, list links, update link) and clarified delete description regarding link removal behavior.
API Reference - Members & User Keywords
docs/api-reference/members/get-project-members.md, docs/api-reference/members/get-workspace-members.md, docs/api-reference/members/overview.md, docs/api-reference/user/get-current-user.md, docs/api-reference/user/overview.md
Enhanced keywords with member/user management terms (project members, workspace members, team members, user profile, authentication).
API Reference - Sticky Notes Keywords & Descriptions
docs/api-reference/sticky/add-sticky.md, docs/api-reference/sticky/delete-sticky.md, docs/api-reference/sticky/get-sticky-detail.md, docs/api-reference/sticky/list-stickies.md, docs/api-reference/sticky/overview.md, docs/api-reference/sticky/update-sticky-detail.md
Updated keywords with sticky-specific terms (sticky note, quick capture, add note, modify note) and clarified delete endpoint description.
API Reference - Teamspace Keywords & Descriptions
docs/api-reference/teamspace/add-projects-to-teamspace.md, docs/api-reference/teamspace/add-teamspace-members.md, docs/api-reference/teamspace/add-teamspace.md, docs/api-reference/teamspace/delete-teamspace.md, docs/api-reference/teamspace/get-teamspace-detail.md, docs/api-reference/teamspace/list-teamspace-members.md, docs/api-reference/teamspace/list-teamspace-projects.md, docs/api-reference/teamspace/list-teamspaces.md, docs/api-reference/teamspace/overview.md, docs/api-reference/teamspace/remove-projects-from-teamspace.md, docs/api-reference/teamspace/remove-teamspace-members.md, docs/api-reference/teamspace/update-teamspace-detail.md
Expanded keywords with teamspace/team management terminology and clarified delete endpoint to describe member/project disassociation and 204 response.
Dev Tools - Agent Documentation
docs/dev-tools/agents/best-practices.md, docs/dev-tools/agents/building-an-agent.md, docs/dev-tools/agents/overview.md, docs/dev-tools/agents/signals-content-payload.md
Updated titles, expanded descriptions covering error handling and payload formats, and added SEO keywords for agent-related concepts.
Dev Tools - OAuth & SDKs Documentation
docs/dev-tools/build-plane-app/choose-token-flow.md, docs/dev-tools/build-plane-app/create-oauth-application.md, docs/dev-tools/build-plane-app/examples.md, docs/dev-tools/build-plane-app/oauth-scopes.md, docs/dev-tools/build-plane-app/overview.md, docs/dev-tools/build-plane-app/sdks.md, docs/dev-tools/build-plane-app/webhooks.md
Expanded descriptions emphasizing OAuth flows, scope details, webhook handling, and SDK availability; added comprehensive keywords for authentication and integration.
Dev Tools - General
docs/dev-tools/plane-compose.md
Added keywords metadata for discoverability.
Self-Hosting - Authentication & Configuration
docs/self-hosting/govern/authentication.md, docs/self-hosting/govern/advanced-search.md, docs/self-hosting/govern/communication.md, docs/self-hosting/govern/configure-dns-email-service.md, docs/self-hosting/govern/configure-ssl.md, docs/self-hosting/govern/custom-domain.md, docs/self-hosting/govern/database-and-storage.md, docs/self-hosting/govern/environment-variables.md, docs/self-hosting/govern/external-secrets.md, docs/self-hosting/govern/ldap.md, docs/self-hosting/govern/oidc-sso.md, docs/self-hosting/govern/private-bucket.md, docs/self-hosting/govern/saml-sso.md
Updated descriptions and keywords to emphasize specific configuration aspects (OpenSearch, auth providers, SMTP, SSL, LDAP, OIDC, SAML, secrets management).
Self-Hosting - OAuth Providers
docs/self-hosting/govern/github-oauth.md, docs/self-hosting/govern/google-oauth.md
Updated keywords to highlight GitHub and Google OAuth integration specifics.
Self-Hosting - Integration Guides
docs/self-hosting/govern/integrations/github.md, docs/self-hosting/govern/integrations/gitlab.md, docs/self-hosting/govern/integrations/sentry.md, docs/self-hosting/govern/integrations/slack.md
Enhanced descriptions and keywords to reflect integration capabilities (PR/commit sync, error tracking, notifications) and added more specific search terms.
Self-Hosting - Admin & Instance Management
docs/self-hosting/govern/instance-admin.md, docs/self-hosting/govern/reverse-proxy.md, docs/self-hosting/govern/reset-password.md
Updated keywords with admin-focused terminology and clarified descriptions for proxy configuration and password recovery.
Self-Hosting - License Management
docs/self-hosting/manage/manage-licenses/activate-airgapped.md, docs/self-hosting/manage/manage-licenses/activate-enterprise.md, docs/self-hosting/manage/manage-licenses/activate-pro-and-business.md
Updated descriptions and keywords to reflect specific license edition features and activation procedures.
Self-Hosting - General Management
docs/self-hosting/manage/backup-restore.md, docs/self-hosting/manage/community-to-airgapped.md, docs/self-hosting/manage/migrate-plane.md, docs/self-hosting/manage/prime-cli.md, docs/self-hosting/manage/upgrade-from-0.13.2-0.14.0.md, docs/self-hosting/manage/upgrade-plane.md, docs/self-hosting/manage/view-logs.md
Enhanced keywords and descriptions for backup/restore, migration, CLI management, upgrades, and troubleshooting/logging scenarios.
Self-Hosting - Deployment Methods
docs/self-hosting/methods/airgapped-edition.md, docs/self-hosting/methods/airgapped-edition-kubernetes.md, docs/self-hosting/methods/airgapped-requirements.md, docs/self-hosting/methods/clone-docker-images.md, docs/self-hosting/methods/coolify.md, docs/self-hosting/methods/docker-aio.md, docs/self-hosting/methods/docker-compose.md, docs/self-hosting/methods/docker-swarm.md, docs/self-hosting/methods/kubernetes.md, docs/self-hosting/methods/one-click.md, docs/self-hosting/methods/podman-quadlets.md, docs/self-hosting/methods/portainer.md
Updated keywords and descriptions with deployment-specific terminology (Docker AIO, Helm charts, Kubernetes, Podman, Coolify, Portainer) and airgapped installation focus.
Self-Hosting - Commercial Deployment Methods
docs/self-hosting/methods/install-methods-commercial/docker-compose.md, docs/self-hosting/methods/install-methods-commercial/kubernetes.md
Updated keywords to emphasize commercial edition deployment (Pro, Business) specifics.
Self-Hosting - Architecture & Telemetry
docs/self-hosting/editions-and-versions.md, docs/self-hosting/plane-architecture.md, docs/self-hosting/telemetry.md
Enhanced descriptions and keywords for edition comparison, system architecture components, and telemetry privacy/opt-out options.
Self-Hosting - Troubleshooting
docs/self-hosting/troubleshoot/cli-errors.md, docs/self-hosting/troubleshoot/installation-errors.md, docs/self-hosting/troubleshoot/license-errors.md, docs/self-hosting/troubleshoot/storage-errors.md
Updated keywords and descriptions with troubleshooting-focused terminology (error types, solutions, license/storage/deployment issues).
Self-Hosting - Upgrades
docs/self-hosting/upgrade-from-community.md
Updated keywords to emphasize community-to-commercial edition migration scenarios.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Poem

🐰 With keywords now polished and descriptions so clear,
Delete endpoints whisper what happens here—
204s gleaming, resources will go,
API docs flourish with searchable glow! ✨

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately and specifically describes the main focus of the changeset: improving SEO by adding keywords and updating descriptions across multiple documentation files.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch improve-seo-with-keywords

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (9)
docs/self-hosting/govern/environment-variables.md (1)

64-64: ⚠️ Potential issue | 🟡 Minor

Pre-existing typo: SITE_ADDRESSITE_ADDRESS.

The variable name in the table is missing the trailing S. Users who copy it verbatim will end up with an unrecognised variable in their Caddy config.

✏️ Proposed fix
-| **SITE_ADDRES** | The domain name and port required by Caddy for serving your Plane instance. This determines how Caddy will handle incoming requests. | `localhost:80` |
+| **SITE_ADDRESS** | The domain name and port required by Caddy for serving your Plane instance. This determines how Caddy will handle incoming requests. | `localhost:80` |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/self-hosting/govern/environment-variables.md` at line 64, Fix the typo
in the environment variables table: replace the incorrect variable name
SITE_ADDRES with SITE_ADDRESS wherever it appears (the table row shown),
ensuring the description and example value remain unchanged so users copy the
correct variable name for Caddy configuration.
docs/self-hosting/methods/install-methods-commercial/kubernetes.md (1)

4-10: ⚠️ Potential issue | 🟡 Minor

SEO keywords have no effect on this page — it's excluded from all search indexing.

The page sets both search: false (disables VitePress built-in search) and noindex, nofollow (prevents external search engine indexing). The new keywords on Line 4 will not be picked up by any search mechanism, making this change a no-op from an SEO perspective.

If this page is intentionally hidden from search, the keyword change can be dropped. If it should eventually be discoverable, the noindex/search: false directives need to be removed first.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/self-hosting/methods/install-methods-commercial/kubernetes.md` around
lines 4 - 10, The frontmatter adds a useless "keywords" entry while the page is
explicitly excluded from indexing (search: false and head meta name: robots
content: noindex, nofollow), so either remove the "keywords:" line entirely to
avoid a no-op, or if the page should be discoverable remove the "search: false"
and the robots noindex meta under "head" so the keywords can take effect; locate
and update the frontmatter keys "keywords", "search", and the "head" meta entry
with name: robots accordingly.
docs/self-hosting/methods/install-methods-commercial/docker-compose.md (1)

4-10: ⚠️ Potential issue | 🟡 Minor

SEO keywords have no effect on this noindex page.

This page explicitly opts out of both external indexing (noindex, nofollow on Lines 9–10) and VitePress internal search (search: false on Line 5). The keywords field added on Line 4 will be ignored by search engines and the internal search engine alike, so this SEO change has no practical impact here.

If this page is intentionally excluded from indexing (e.g., it's a duplicate route for the commercial install path), the keywords update can be skipped. If it should be discoverable, the noindex/search: false flags should be revisited instead.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/self-hosting/methods/install-methods-commercial/docker-compose.md`
around lines 4 - 10, The frontmatter includes a redundant "keywords" field that
has no effect because "search: false" and the "head" meta robots entry is set to
"noindex, nofollow"; either remove the "keywords" line from the frontmatter if
the page should remain excluded, or if the page should be discoverable,
change/remove the "search: false" and the "head" meta robots value ("noindex,
nofollow") so the "keywords" take effect—update the frontmatter accordingly
(edit the "keywords", "search", and "head" entries).
docs/api-reference/module/delete-module.md (1)

72-94: ⚠️ Potential issue | 🟡 Minor

response.json() called on a body-less 204 response will throw.

Both the Python (print(response.json())) and the JavaScript (await response.json()) snippets attempt to parse a response body that does not exist for a 204 No Content. Python raises json.JSONDecodeError; the Fetch API rejects the promise with a SyntaxError.

🛠️ Proposed fix
-print(response.json())
+print(response.status_code)  # 204 No Content
-const data = await response.json();
+// 204 No Content — no body to parse
+console.log(response.status); // 204
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/api-reference/module/delete-module.md` around lines 72 - 94, The
examples call response.json() on a 204 No Content response which will throw;
update both samples to first check for no-content before parsing: in the Python
snippet (the requests.delete call and subsequent print(response.json())) inspect
response.status_code (or response.content) and only call response.json() when
status_code != 204 (otherwise print a success message or response.status_code);
in the JavaScript snippet (the fetch call where you await response.json() into
data) check response.status === 204 (or use
response.headers.get('content-length')/response.ok) and avoid calling
response.json() for 204 responses, handling them with a suitable success message
instead.
docs/api-reference/link/add-link.md (1)

135-147: ⚠️ Potential issue | 🟡 Minor

Response example shows project fields instead of link fields.

The 201 body contains name, identifier, and description — fields from a project object. Per the Link object definition in the overview, the response should contain title, url, metadata, project, workspace, issue, etc.

📄 Proposed fix
 <ResponsePanel status="201">
 
 ```json
 {
-  "id": "project-uuid",
-  "name": "Project Name",
-  "identifier": "PROJ",
-  "description": "Project description",
-  "created_at": "2024-01-01T00:00:00Z"
+  "id": "662dd6b2-2b01-4315-955f-480eb51baa14",
+  "created_at": "2024-01-01T00:00:00Z",
+  "updated_at": "2024-01-01T00:00:00Z",
+  "title": "example-title",
+  "url": "https://example.com",
+  "metadata": {},
+  "created_by": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
+  "updated_by": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
+  "project": "4af68566-94a4-4eb3-94aa-50dc9427067b",
+  "workspace": "cd4ab5a2-1a5f-4516-a6c6-8da1a9fa5be4",
+  "issue": "e1c25c66-5bb8-465e-a818-92a483423443"
 }
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @docs/api-reference/link/add-link.md around lines 135 - 147, The response
example inside ResponsePanel currently shows a Project object (fields like name,
identifier, description) instead of a Link object; update the JSON example in
add-link.md (the ResponsePanel block returning 201) to match the Link schema by
replacing project fields with Link fields such as id, created_at, updated_at,
title, url, metadata, created_by, updated_by, project, workspace, and issue (use
realistic UUIDs and timestamps as in the proposed fix) so the example aligns
with the Link object definition referenced in the overview.


</details>

</blockquote></details>
<details>
<summary>docs/api-reference/link/get-link-detail.md (1)</summary><blockquote>

`106-117`: _⚠️ Potential issue_ | _🟡 Minor_

**Same copy-paste issue as `add-link.md` — response body shows project fields instead of link fields.**

`name`, `identifier`, and `description` are project attributes. The GET response for a link should mirror the Link object schema (see `overview.md`).

<details>
<summary>📄 Proposed fix</summary>

```diff
 <ResponsePanel status="200">
 
 ```json
 {
-  "id": "project-uuid",
-  "name": "Project Name",
-  "identifier": "PROJ",
-  "description": "Project description",
-  "created_at": "2024-01-01T00:00:00Z"
+  "id": "662dd6b2-2b01-4315-955f-480eb51baa14",
+  "created_at": "2024-01-01T00:00:00Z",
+  "updated_at": "2024-01-01T00:00:00Z",
+  "title": "Plane Website",
+  "url": "https://plane.so",
+  "metadata": {},
+  "created_by": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
+  "updated_by": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
+  "project": "4af68566-94a4-4eb3-94aa-50dc9427067b",
+  "workspace": "cd4ab5a2-1a5f-4516-a6c6-8da1a9fa5be4",
+  "issue": "e1c25c66-5bb8-465e-a818-92a483423443"
 }
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @docs/api-reference/link/get-link-detail.md around lines 106 - 117, The
response example in get-link-detail.md mistakenly shows project fields (name,
identifier, description); replace that JSON with a Link object example matching
the Link schema used in overview.md: include id, created_at, updated_at, title,
url, metadata (object), created_by, updated_by, project, workspace, and issue
with realistic UUIDs/timestamps so the GET /link response mirrors the Link
object structure rather than project attributes.


</details>

</blockquote></details>
<details>
<summary>docs/api-reference/link/delete-link.md (1)</summary><blockquote>

`80-100`: _⚠️ Potential issue_ | _🟡 Minor_

**Same `.json()`-on-204 issue as in `delete-teamspace.md`.**

Both the Python (`print(response.json())`) and JavaScript (`const data = await response.json()`) samples will throw on the empty 204 body. See the fix pattern proposed in `delete-teamspace.md`.

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @docs/api-reference/link/delete-link.md around lines 80 - 100, The examples
call response.json() unguarded which will throw on a 204 No Content response;
update both the Python example (print(response.json())) and the JavaScript
example (const data = await response.json()) to first check the response status
or existence of a body (e.g., response.status === 204 or check
Content-Length/response.text() length) and only parse JSON when there is
content, otherwise handle the empty 204 case appropriately (e.g., print a
success message or set data to null).


</details>

</blockquote></details>
<details>
<summary>docs/api-reference/teamspace/list-teamspace-projects.md (1)</summary><blockquote>

`53-55`: _⚠️ Potential issue_ | _🟡 Minor_

**Duplicate `name="limit"` — second query parameter should be `name="offset"`.**

The second `<ApiParam>` documents the skip/pagination offset but reuses `name="limit"`, making both parameters appear identical in the rendered docs.

<details>
<summary>🐛 Proposed fix</summary>

```diff
-<ApiParam name="limit" type="number">
+<ApiParam name="offset" type="number">

 Number of results to skip for pagination.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/api-reference/teamspace/list-teamspace-projects.md` around lines 53 -
55, The second <ApiParam> entry currently reuses name="limit" causing duplicate
parameters; update that second ApiParam to use name="offset" (the pagination
skip/offset parameter) and ensure its description remains "Number of results to
skip for pagination." so the docs render distinct limit and offset params; look
for the duplicated <ApiParam name="limit"> block in the list-teamspace-projects
doc and change its name attribute to "offset".
docs/api-reference/teamspace/delete-teamspace.md (1)

68-88: ⚠️ Potential issue | 🟡 Minor

Code samples call .json() on a 204 No Content response — this will throw.

The updated description now explicitly advertises Returns 204 on success, making it more likely that readers will test these snippets verbatim. A 204 response has no body; both response.json() (Python requests) and response.json() (Fetch API) raise/reject when called against an empty body.

🐛 Proposed fix for both samples
 response = requests.delete(
     "https://api.plane.so/api/v1/workspaces/my-workspace/teamspaces/{teamspace_id}/",
     headers={"X-API-Key": "your-api-key"}
 )
-print(response.json())
+# 204 No Content — no response body
+print(response.status_code)  # 204
 const response = await fetch(
   "https://api.plane.so/api/v1/workspaces/my-workspace/teamspaces/{teamspace_id}/",
   { method: "DELETE", headers: { "X-API-Key": "your-api-key" } }
 );
-const data = await response.json();
+// 204 No Content — no response body
+console.log(response.status); // 204

The same pattern appears in the Python/JS samples of other delete-endpoint docs updated in this PR (delete-link.md, delete-project.md).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/api-reference/teamspace/delete-teamspace.md` around lines 68 - 88, The
samples call response.json() unconditionally which will throw on a 204 No
Content; update both snippets (the Python requests.delete call and the JS fetch
call) to check the response status (e.g., if response.status_code == 204 / if
(response.status === 204)) or inspect the body before calling response.json(),
and only parse JSON when there is content—otherwise handle the success case
without parsing (e.g., print a success message or return early).

@sriramveeraghanta sriramveeraghanta merged commit 1d2c5ab into master Feb 23, 2026
3 of 4 checks passed
@sriramveeraghanta sriramveeraghanta deleted the improve-seo-with-keywords branch February 23, 2026 13:02
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.

2 participants