diff --git a/.changeset/hot-grapes-allow.md b/.changeset/hot-grapes-allow.md
new file mode 100644
index 00000000..b89d7046
--- /dev/null
+++ b/.changeset/hot-grapes-allow.md
@@ -0,0 +1,5 @@
+---
+"docs": patch
+---
+
+Chore/documentation quality
diff --git a/packages/docs/docs/addons/links/getting-started/ckeditor.md b/packages/docs/docs/addons/links/getting-started/ckeditor.md
index f59a8b04..95a4dba0 100644
--- a/packages/docs/docs/addons/links/getting-started/ckeditor.md
+++ b/packages/docs/docs/addons/links/getting-started/ckeditor.md
@@ -4,11 +4,26 @@ displayed_sidebar: webtoolsLinksSidebar
slug: /addons/links/ckeditor
---
+import ThemedImage from '@theme/ThemedImage';
+import useBaseUrl from '@docusaurus/useBaseUrl';
+
# Ckeditor integration
-This addon has an integration with [the Ckeditor plugin](https://github.com/nshenderov/strapi-plugin-ckeditor). If the Ckeditor plugin is installed this addon will replace the link button in the editor. With this new button you can create internal links in the ckeditor.
+This addon has an integration with [the Ckeditor plugin](https://github.com/nshenderov/strapi-plugin-ckeditor). If the Ckeditor plugin is installed this addon will replace the link button in the editor. With this new button you can create internal links in the ckeditor.
-
+
If you click the link button it will open a modal in which you can manage your links.
-
+
diff --git a/packages/docs/docs/addons/links/getting-started/custom-field.md b/packages/docs/docs/addons/links/getting-started/custom-field.md
index 936973de..18041586 100644
--- a/packages/docs/docs/addons/links/getting-started/custom-field.md
+++ b/packages/docs/docs/addons/links/getting-started/custom-field.md
@@ -4,14 +4,29 @@ displayed_sidebar: webtoolsLinksSidebar
slug: /addons/links/custom-field
---
+import ThemedImage from '@theme/ThemedImage';
+import useBaseUrl from '@docusaurus/useBaseUrl';
+
# Custom field
This addon introduces a new custom field which you can add to your content types. This field can be used in your content types to accommodate internal linking from one page to another.
-
+
### This custom field will provide you three options in the advanced settings:
* Set the link to "internal" and now you can search on something like "My first blog post". The field stores a documentId reference, so the link keeps working even if the slug or URL changes.
* Set the link to "external" so you can enter a full url, e.g. https://strapi.io/
* Set the link to "Internal & external links" and have both link options as described above, this is the default value.
-
+
diff --git a/packages/docs/docs/addons/redirects/api/rest.md b/packages/docs/docs/addons/redirects/api/rest.md
index 6ef5dfec..87b993e2 100644
--- a/packages/docs/docs/addons/redirects/api/rest.md
+++ b/packages/docs/docs/addons/redirects/api/rest.md
@@ -14,6 +14,17 @@ The plugin exposes a REST API endpoint that you can use to implement the redirec
Use Public role or API Tokens as per Strapi defaults.
+### Permissions
+
+:::danger Permissions Required
+Before you can use the redirects endpoint publicly, you need to configure the **find** permission. Without proper permissions, you'll get a **403 Forbidden** error.
+
+**Quick Setup in Settings > Users & Permissions > Roles > Public:**
+- `webtools-addon-redirects.redirect.find`
+
+For detailed permission configuration including API tokens and admin panel access, see the [API Permissions](/webtools/addons/redirects/api-permissions) and [Admin Permissions](/webtools/addons/redirects/admin-permissions) documentation.
+:::
+
@@ -71,11 +82,3 @@ Use Public role or API Tokens as per Strapi defaults.
-## Permissions
-
-Before you can use the redirects endpoint publicly, you need to configure the *find* permission.
-
-### Quick Setup
-
-Enable in **Settings > Users & Permissions > Roles > Public**:
-- `webtools-addon-redirects.redirect.find`
diff --git a/packages/docs/docs/addons/redirects/configuration/auto-generate.md b/packages/docs/docs/addons/redirects/configuration/auto-generate.md
index 229c20ca..a665c748 100644
--- a/packages/docs/docs/addons/redirects/configuration/auto-generate.md
+++ b/packages/docs/docs/addons/redirects/configuration/auto-generate.md
@@ -6,7 +6,97 @@ slug: /addons/redirects/configuration/auto-generate
# Auto generate
-When this option is set to true (which it is by default) the addon will automatically generate a redirect whenever you change the URL alias of a page. This way you will never have dead links in your website!
+## Overview
+
+The auto-generate feature automatically creates redirects whenever you change the URL alias of a content entry in your Strapi application. This ensures visitors following old links will be seamlessly redirected to the new URL without encountering broken links or 404 errors.
+
+## How it works
+
+When enabled (which it is by default), the addon monitors URL alias changes and creates redirect entries automatically:
+
+1. You change a page's URL from `/old-blog-post` to `/new-blog-post`
+2. The addon detects this change
+3. A redirect is automatically created: `/old-blog-post` → `/new-blog-post`
+4. Visitors using the old URL are redirected to the new location
+
+## Why use this?
+
+**Preserves SEO rankings**: Search engines have indexed your old URLs. Redirects ensure you don't lose search engine rankings when changing URLs.
+
+**Prevents broken links**: External sites, bookmarks, and shared links pointing to your old URLs continue to work.
+
+**Improves user experience**: Visitors are automatically sent to the correct page instead of seeing a 404 error.
+
+**Saves time**: No need to manually track and create redirects for every URL change.
+
+## Example scenario
+
+Imagine you have a blog post at `/blog/how-to-use-strapi` that's been shared widely and indexed by Google. Later, you decide to rename it to `/blog/complete-strapi-guide`.
+
+**With auto-generate enabled:**
+- You update the URL alias in Strapi
+- A redirect is automatically created
+- Old links continue to work
+- Your SEO rankings are preserved
+
+**With auto-generate disabled:**
+- You update the URL alias in Strapi
+- Old links lead to 404 errors
+- You lose traffic from external links
+- You have to manually create redirects
+
+## When to disable
+
+You might want to disable auto-generate if:
+- You want full manual control over all redirects
+- You're doing bulk URL changes and want to review redirects afterwards
+- You're migrating content and have a custom redirect strategy
+
+:::tip
+Keep this enabled for production sites. It's a safety net that prevents broken links automatically.
+:::
+
+## Multiple URL Changes
+
+When you change the same URL multiple times, the addon intelligently manages redirects to prevent chains:
+
+**Scenario 1: First URL change**
+```
+Original URL: /my-article
+New URL: /my-article-updated
+
+Result: Creates redirect /my-article → /my-article-updated ✓
+```
+
+**Scenario 2: Second URL change (updates existing redirect)**
+```
+Current URL: /my-article-updated
+New URL: /my-article-final
+
+Result:
+- Updates existing redirect to: /my-article → /my-article-final ✓
+- Creates new redirect: /my-article-updated → /my-article-final ✓
+```
+
+This strategy prevents redirect chains and ensures all old URLs point directly to the current URL. Both `/my-article` and `/my-article-updated` will redirect straight to `/my-article-final` without intermediate hops.
+
+:::tip Smart Redirect Management
+The addon automatically updates existing redirects that point to the old URL, ensuring no chains are created. This means you can freely change URLs multiple times without worrying about redirect performance.
+:::
+
+## Chain Prevention
+
+Auto-generate includes built-in protection against [redirect chains and loops](/addons/redirects/usage#redirect-chains-and-loops). If a URL change would create a chain or loop, the system will:
+
+1. **Log an error** in your server console
+2. **Skip creating the redirect** automatically
+3. **Allow you to manually resolve** the conflict
+
+Check your server logs if you suspect redirects aren't being created as expected.
+
+## Difference from sitemap cron
+
+Unlike the sitemap addon which uses a cron job to periodically regenerate files, redirects are created **instantly** when you change a URL. There's no delay and no need for scheduled tasks - redirects are event-driven and created the moment you save your changes.
###### Key: `auto_generate `
diff --git a/packages/docs/docs/addons/redirects/configuration/default-status-code.md b/packages/docs/docs/addons/redirects/configuration/default-status-code.md
index 2327426b..d0a49362 100644
--- a/packages/docs/docs/addons/redirects/configuration/default-status-code.md
+++ b/packages/docs/docs/addons/redirects/configuration/default-status-code.md
@@ -1,5 +1,5 @@
---
-sidebar_label: 'Cron'
+sidebar_label: 'Default status code'
displayed_sidebar: webtoolsRedirectsSidebar
slug: /addons/redirects/configuration/default-status-code
---
diff --git a/packages/docs/docs/addons/redirects/getting-started/admin-permissions.md b/packages/docs/docs/addons/redirects/getting-started/admin-permissions.md
new file mode 100644
index 00000000..886a91a1
--- /dev/null
+++ b/packages/docs/docs/addons/redirects/getting-started/admin-permissions.md
@@ -0,0 +1,98 @@
+---
+sidebar_label: 'Admin Permissions'
+displayed_sidebar: webtoolsRedirectsSidebar
+slug: /addons/redirects/admin-permissions
+---
+
+# 🔐 Admin Panel Permissions
+
+Configure granular permissions to control what administrators can do with redirects in the Strapi admin panel.
+
+---
+
+## Configuration
+
+To configure permissions for a role:
+
+1. Go to **Strapi Admin → Settings → Administration Panel → Roles**.
+2. Choose the role (e.g., **Editor**, **Author**).
+3. Scroll to **Webtools-addon-redirects** plugin section.
+4. Enable the permissions needed for this role.
+5. Click **Save**.
+
+---
+
+## Available Permissions
+
+The following table lists all available permissions for the Redirects addon in the admin panel:
+
+| Permission | Description |
+|------------|-------------|
+| **Access the redirects plugin** | Gives access to the redirects overview page at `/plugins/webtools/redirects` |
+| **Create** | Allows to create new redirect rules |
+| **Read** | Allows to view existing redirect configurations |
+| **Update** | Allows to edit existing redirect rules |
+| **Delete** | Allows to remove redirect rules from the system |
+
+---
+
+## Permission Combinations
+
+Common permission setups for different roles:
+
+| Role | Access | Create | Read | Update | Delete |
+|------|--------|--------|------|--------|--------|
+| **Content Editor** | ✅ | ✅ | ✅ | ✅ | ❌ |
+| **Senior Editor** | ✅ | ✅ | ✅ | ✅ | ✅ |
+| **Viewer** | ✅ | ❌ | ✅ | ❌ | ❌ |
+
+**Content Editor** - Can manage redirects but cannot delete them to prevent accidental data loss.
+
+**Senior Editor** - Has full access to all redirect management features.
+
+**Viewer** - Can view redirects in read-only mode without making changes.
+
+---
+
+## Super Admin Role
+
+:::info Automatic Access
+The **Super Admin** role has all permissions enabled by default and cannot be modified. All configurations are in read-only mode.
+:::
+
+The **Settings** button visible in the permissions UI is for configuring RBAC conditions on other roles, but has no effect on Super Admin permissions.
+
+---
+
+## Testing Permissions
+
+To verify permissions are configured correctly:
+
+1. Create a test user with the configured role
+2. Log in as that user
+3. Navigate to **Webtools → Redirects**
+4. Verify the available actions match the configured permissions
+
+:::tip
+Restart Strapi and clear your browser cache after making permission changes.
+:::
+
+---
+
+## Troubleshooting
+
+**Webtools menu not visible:**
+- Verify the role has at least "Access the redirects plugin" permission enabled
+- Log out and log back in
+- Clear browser cache
+
+**Action buttons missing:**
+- Check that Create/Update/Delete permissions are enabled for the role
+- Refresh the page
+- Check browser console for errors
+
+**Permission changes not applying:**
+- Verify you clicked "Save" after modifying permissions
+- Restart Strapi server
+- Have the user log out and log back in
+- Clear browser cache and cookies
diff --git a/packages/docs/docs/addons/redirects/getting-started/api-permissions.md b/packages/docs/docs/addons/redirects/getting-started/api-permissions.md
new file mode 100644
index 00000000..d311c816
--- /dev/null
+++ b/packages/docs/docs/addons/redirects/getting-started/api-permissions.md
@@ -0,0 +1,181 @@
+---
+sidebar_label: 'API Permissions'
+displayed_sidebar: webtoolsRedirectsSidebar
+slug: /addons/redirects/api-permissions
+---
+
+# 🔐 API Permissions
+
+The Redirects addon exposes a public API endpoint that your frontend can use to fetch redirect rules. This requires proper permissions configuration.
+
+---
+
+## Setting up Public API Access
+
+For your frontend application to access the redirects API endpoint.
+
+### Configuration Steps
+
+1. Go to **Strapi Admin → Settings → Users & Permissions plugin → Roles**.
+2. Select the role (e.g., **Public** or **Authenticated**).
+3. Under **Webtools-addon-redirects** section.
+4. Check **Redirect: find**.
+5. Click **Save**.
+
+### What it enables
+
+- Access to `GET /api/webtools/redirects` endpoint
+- Required for: Frontend redirect implementation
+
+:::danger Required for Frontend
+Without this permission, you'll get a **403 Forbidden** error when calling the redirects API from your frontend.
+:::
+
+---
+
+## Access via API Tokens
+
+In addition to the Users & Permissions plugin (for public and authenticated users), you can also use **API Tokens** for programmatic access to the redirects endpoint.
+
+### When to use API Tokens
+
+- **Build-time data fetching**: Static site generators (Next.js, Gatsby, etc.)
+- **Server-to-server communication**: Backend services fetching redirect rules
+- **CI/CD pipelines**: Automated testing or validation of redirects
+- **Webhook handlers**: External services that need to check redirects
+
+### Creating an API Token
+
+1. Go to **Strapi Admin → Settings → API Tokens**.
+2. Click **Create new API Token**.
+3. Configure the token:
+ - **Name**: e.g., "Frontend Build Token" or "Redirects API Access"
+ - **Description**: Optional description of the token's purpose
+ - **Token duration**: Unlimited, 7 days, 30 days, or 90 days
+ - **Token type**: Choose based on your needs:
+ - **Read-only**: Can only fetch data (recommended for redirects)
+ - **Full access**: Can create, update, and delete (use with caution)
+ - **Custom**: Fine-grained permissions (see below)
+
+4. Click **Save** and copy the generated token immediately (it won't be shown again).
+
+### Configuring Custom Permissions for API Tokens
+
+For better security, use **Custom** token type with specific permissions:
+
+1. Select **Custom** as Token type.
+2. Scroll to **Webtools-addon-redirects** section.
+3. Enable only the permissions needed:
+ - **find**: Allows `GET /api/webtools/redirects` (✅ recommended)
+ - **findOne**: Allows fetching a single redirect by ID
+ - **create**, **update**, **delete**: Only enable if programmatic management is needed
+
+:::tip Security Best Practice
+Use **Read-only** tokens or **Custom** tokens with only `find` permission enabled for frontend applications. Never expose tokens with write permissions in client-side code.
+:::
+
+### Using the API Token
+
+Include the token in the `Authorization` header when making requests:
+
+```bash
+curl -H "Authorization: Bearer YOUR_API_TOKEN" \
+ "http://localhost:1337/api/webtools/redirects"
+```
+
+**Next.js example (server-side):**
+```javascript
+// app/[[...slug]]/page.tsx or pages/[[...slug]].tsx
+export async function generateStaticParams() {
+ const response = await fetch('https://your-strapi.com/api/webtools/redirects', {
+ headers: {
+ 'Authorization': `Bearer ${process.env.STRAPI_API_TOKEN}`,
+ },
+ });
+ const redirects = await response.json();
+ // Process redirects...
+}
+```
+
+**Important:** Store API tokens in environment variables (`.env.local`), never commit them to version control.
+
+---
+
+## Testing API Access
+
+### Test with Public/Authenticated role
+```bash
+# Without authentication (requires Public role permissions)
+curl "http://localhost:1337/api/webtools/redirects"
+
+# With user JWT token (requires Authenticated role permissions)
+curl -H "Authorization: Bearer USER_JWT_TOKEN" \
+ "http://localhost:1337/api/webtools/redirects"
+```
+
+### Test with API Token
+```bash
+curl -H "Authorization: Bearer YOUR_API_TOKEN" \
+ "http://localhost:1337/api/webtools/redirects"
+```
+
+**Expected response:**
+```json
+{
+ "data": [
+ {
+ "id": 1,
+ "source": "/old-page",
+ "destination": "/new-page",
+ "statusCode": 301,
+ // ...
+ }
+ ]
+}
+```
+
+:::tip
+After making permission changes, restart Strapi and clear your browser cache if needed.
+:::
+
+---
+
+## Troubleshooting
+
+### 403 Forbidden Error
+
+**Problem:** Getting 403 when calling the API endpoint.
+
+**Solutions:**
+- Verify the correct role (Public/Authenticated) has `find` permission enabled
+- If using API token, verify it's valid and has correct permissions
+- Restart Strapi after permission changes
+- Check that the token hasn't expired
+
+### API Token not working
+
+**Problem:** Valid token returns 401 Unauthorized.
+
+**Solutions:**
+- Ensure token is included in `Authorization: Bearer TOKEN` header
+- Verify token hasn't expired
+- Check token type has necessary permissions (not Read-only for write operations)
+- Regenerate token if needed
+
+### CORS issues in frontend
+
+**Problem:** Browser blocks API requests.
+
+**Solutions:**
+- Configure CORS in `config/middlewares.js`:
+```javascript
+module.exports = [
+ // ...
+ {
+ name: 'strapi::cors',
+ config: {
+ origin: ['http://localhost:3000', 'https://your-frontend.com'],
+ },
+ },
+];
+```
diff --git a/packages/docs/docs/addons/redirects/getting-started/introduction.md b/packages/docs/docs/addons/redirects/getting-started/introduction.md
index 501bd6f9..1ccb1c03 100644
--- a/packages/docs/docs/addons/redirects/getting-started/introduction.md
+++ b/packages/docs/docs/addons/redirects/getting-started/introduction.md
@@ -14,9 +14,9 @@ This plugin acts as an extension of the core `strapi-plugin-webtools`. Please in
## ✨ Features
-- **Automatic creation** (Automatic redirect creation when your URL changes)
-- **Chain detection** (Prevents you from creating redirects that create chains)
-- **Loop detection** (Prevents you from creating redirects that create loops)
-- **Custom redirects** (Create custom redirects, separate from Webtools pages)
-- **API endpoint** (Fetch and use the redirects in your front-end)
+- **Automatic creation** - Automatic redirect creation when your URL changes ([learn more](/addons/redirects/configuration/auto-generate))
+- **Chain detection** - Prevents you from creating redirects that create chains ([what are chains?](/addons/redirects/usage#what-is-a-redirect-chain))
+- **Loop detection** - Prevents you from creating redirects that create loops ([what are loops?](/addons/redirects/usage#what-is-a-redirect-loop))
+- **Custom redirects** - Create custom redirects, separate from Webtools pages
+- **API endpoint** - Fetch and use the redirects in your front-end ([REST API docs](/addons/redirects/api/rest))
diff --git a/packages/docs/docs/addons/redirects/getting-started/usage.md b/packages/docs/docs/addons/redirects/getting-started/usage.md
index 378ac723..8b2712e2 100644
--- a/packages/docs/docs/addons/redirects/getting-started/usage.md
+++ b/packages/docs/docs/addons/redirects/getting-started/usage.md
@@ -4,6 +4,9 @@ displayed_sidebar: webtoolsRedirectsSidebar
slug: /addons/redirects/usage
---
+import ThemedImage from '@theme/ThemedImage';
+import useBaseUrl from '@docusaurus/useBaseUrl';
+
# 💡 Usage
With this plugin you have full control over which redirects should be active for your front-end. You can create, update and delete redirects right from the Strapi admin panel.
@@ -11,19 +14,209 @@ With this plugin you have full control over which redirects should be active for
On the redirects overview you can see all the redirects on your site.
-
+
## Create redirects
With the button in the top right you can create new redirects.
-
+
+
+### URL Format
+
+When creating redirects, follow these guidelines for the URL paths:
+
+**From Path (Source URL):**
+- Always start with a forward slash `/`
+- Use relative paths only (no domain)
+- Example: `/old-page` or `/blog/old-article`
+
+**To Path (Destination URL):**
+- For internal redirects: use relative paths starting with `/`
+ - Example: `/new-page` or `/blog/new-article`
+- For external redirects: use the full URL including protocol
+ - Example: `https://example.com/page`
+
+**Examples:**
+
+| From Path | To Path | Description |
+|-----------|---------|-------------|
+| `/old-page` | `/new-page` | Internal redirect |
+| `/blog/article` | `/news/article` | Internal redirect to different section |
+| `/external` | `https://example.com` | External redirect |
+
+### Status Codes
+
+Choose the appropriate HTTP status code for your redirect:
+
+| Status Code | Name | Description | Use Case |
+|-------------|------|-------------|----------|
+| **301** | Permanent Redirect | The resource has been permanently moved to a new location. Search engines will transfer the SEO value to the new URL. | Use when a page has permanently moved and you want to preserve SEO rankings. |
+| **302** | Temporary Redirect | The resource is temporarily at a different location. Search engines keep the original URL indexed. | Use for temporary changes, A/B testing, or maintenance pages. |
+| **303** | See Other | The response to the request can be found at another URL using a GET request. | Use after POST/PUT requests to redirect to a confirmation page. |
+| **307** | Temporary Redirect (Preserve Method) | Like 302, but guarantees the request method won't change. | Use when you need to preserve POST/PUT methods in the redirect. |
+| **308** | Permanent Redirect (Preserve Method) | Like 301, but guarantees the request method won't change. | Use for permanent redirects where the request method must be preserved. |
+
+:::tip Choosing the Right Status Code
+- **Most common:** Use **301** for permanent redirects and **302** for temporary ones
+- **SEO impact:** 301 redirects transfer ~90-99% of link equity to the new URL
+- **Caching:** 301 redirects are cached by browsers, 302 redirects are not
+:::
+
+:::caution
+Be careful with 301 redirects as they are heavily cached by browsers. If you need to change a 301 redirect, users may not see the change immediately due to browser caching.
+:::
## Access
-After you've followed the steps above you can now access your sitemap through the REST api of strapi. It will be available at:
+After you've followed the steps above you can now access your redirects through the REST API of Strapi. It will be available at:
http://localhost:1337/api/webtools/redirects.
:::caution
-You might have to setup permissions for this endpoint to be accessible.
+You need to setup permissions for this endpoint to be accessible. See the [REST API documentation](/webtools/addons/redirects/api/rest#permissions) for details.
:::
+
+## Frontend Implementation
+
+Now that you have access to the redirects API, you need to implement the redirects in your frontend. There are two approaches:
+
+### Option 1: Framework Redirects Configuration
+
+Most modern frameworks have built-in redirect features (Next.js, Nuxt, etc.). You can fetch redirects from the Strapi API and configure them in your framework's configuration file.
+
+**Note:** This approach is framework-specific and requires different setup for each framework. Consult your framework's documentation for redirect configuration.
+
+### Option 2: API Check Before Router (Recommended)
+
+The recommended approach is to check for redirects **before** calling the Webtools router endpoint. This works consistently across all frameworks and tech stacks.
+
+**Flow:**
+1. User navigates to a URL (e.g., `/old-page`)
+2. Your frontend calls the redirects API: `GET /api/webtools/redirects`
+3. Check if the current path matches any redirect's `from` field
+4. **If redirect exists:** Navigate to the `to` URL with the appropriate status code
+5. **If no redirect:** Proceed to call the Webtools router endpoint: `GET /api/webtools/router?path=/old-page`
+
+**Why this works:**
+- Framework-agnostic solution
+- Works with the [Webtools router endpoint](/api/rest#router) pattern you're already using
+- Ensures redirects are checked before attempting to fetch content
+- No need for complex server middleware or build-time configuration
+
+**Performance tip:** Cache the redirects list in memory for 1-5 minutes to avoid fetching on every request.
+
+:::tip Integration with Webtools Router
+This approach integrates seamlessly with the Webtools router workflow. See the [REST API Router documentation](/api/rest#router) for details on how to fetch content by path.
+:::
+
+**No Cron Needed:** Unlike the [sitemap addon](/addons/sitemap/configuration/cron) which uses cron jobs to generate files, redirects are immediately available via the API after creation in the admin panel.
+
+## Redirect Chains and Loops
+
+The Webtools Redirects addon includes built-in protection against redirect chains and loops, which can harm user experience and SEO.
+
+### What is a Redirect Chain?
+
+A **redirect chain** occurs when multiple redirects are needed to reach the final destination. This creates an inefficient path that slows down page loads.
+
+**Example of a chain:**
+```
+/page-a → /page-b → /page-c (final destination)
+```
+
+When a user visits `/page-a`, they are first redirected to `/page-b`, then redirected again to `/page-c`. This requires two HTTP requests instead of one.
+
+**Why chains are problematic:**
+- **Slower page loads**: Each redirect adds network latency
+- **SEO penalties**: Search engines may not follow long chains and could lose link equity
+- **User experience**: Visitors experience longer wait times
+- **Server load**: More requests mean more server resources
+
+**Best practice:** Always redirect directly to the final destination:
+```
+/page-a → /page-c
+/page-b → /page-c
+```
+
+### What is a Redirect Loop?
+
+A **redirect loop** occurs when redirects create a circular reference with no final destination.
+
+**Example of a loop:**
+```
+/page-a → /page-b → /page-a (back to start)
+```
+
+This creates an infinite loop where the browser keeps redirecting between pages until it gives up and shows an error.
+
+**Why loops are critical:**
+- **Broken website**: The page becomes completely inaccessible
+- **Browser errors**: Users see "Too many redirects" or "Redirect loop detected"
+- **SEO disaster**: Search engines cannot index the page
+
+### Chain and Loop Detection
+
+The addon automatically validates redirects and **prevents you from creating chains or loops**. If you try to create a redirect that would result in a chain or loop, you'll see an error:
+
+```
+Creating this redirect would create a chain, please change it.
+```
+
+**Common scenarios that trigger this error:**
+
+1. **Existing redirect path:** You try to create a redirect where the "To" path is already the "From" path of another redirect
+
+ ```
+ Existing: /old-page → /new-page
+ Attempt: /campaign → /old-page ❌ (would create chain)
+ ```
+
+2. **Reverse redirect:** You try to create a redirect that reverses an existing one
+
+ ```
+ Existing: /page-a → /page-b
+ Attempt: /page-b → /page-a ❌ (would create loop)
+ ```
+
+3. **URL alias conflict:** You change a URL alias to a path that's involved in an existing redirect
+
+ ```
+ Existing redirect: /google → /google5
+ Changing URL alias from /google5 to /google ❌ (would create conflict)
+ ```
+
+### How to Fix Chain/Loop Errors
+
+**If you encounter this error:**
+
+1. **Check existing redirects**: Review your redirect list for conflicts
+2. **Update existing redirects**: Instead of creating a new redirect, update the existing one to point directly to the final destination
+3. **Delete conflicting redirects**: Remove the redirect that's causing the chain, then create a new direct redirect
+4. **Plan URL changes carefully**: Before changing URL aliases, check if redirects exist for those paths
+
+**Example fix:**
+
+```
+Problem:
+ - Existing redirect: /old → /current
+ - You want to change URL from /current to /new
+ - This would create: /old → /current → /new ❌
+
+Solution:
+ 1. Update the existing redirect to: /old → /new
+ 2. Then change the URL alias to /new
+ 3. Auto-generate creates: /current → /new
+ 4. Result: /old → /new and /current → /new ✓
+```
diff --git a/packages/docs/docs/addons/sitemap/getting-started/admin-permissions.md b/packages/docs/docs/addons/sitemap/getting-started/admin-permissions.md
new file mode 100644
index 00000000..5adede9f
--- /dev/null
+++ b/packages/docs/docs/addons/sitemap/getting-started/admin-permissions.md
@@ -0,0 +1,107 @@
+---
+sidebar_label: 'Admin Permissions'
+displayed_sidebar: webtoolsSitemapSidebar
+slug: /addons/sitemap/admin-permissions
+---
+
+# 🔐 Admin Panel Permissions
+
+Configure permissions to control administrator access to sitemap settings in the Strapi admin panel.
+
+---
+
+## Configuration
+
+To configure permissions for a role:
+
+1. Go to **Strapi Admin → Settings → Administration Panel → Roles**
+2. Choose the role (e.g., **Editor**, **Author**)
+3. Scroll to **Webtools-addon-sitemap** plugin section
+4. Enable the permissions needed for this role
+5. Click **Save**
+
+---
+
+## Available Permissions
+
+The following table lists all available permissions for the Sitemap addon in the admin panel:
+
+| Permission | Description |
+|------------|-------------|
+| **Access the plugin settings** | Gives access to the sitemap settings page at `/plugins/webtools/sitemap` and allows to view configuration and manually regenerate sitemaps |
+
+:::info Read-Only Access
+The sitemap addon provides primarily read-only access in the admin panel. Configuration changes must be made in `config/plugins.js` and require developer or system administrator access.
+:::
+
+---
+
+## What Users Can Do
+
+Users with "Access the plugin settings" permission can:
+
+- View sitemap configuration (hostname, exclude drafts, etc.)
+- See sitemap generation status and last generation time
+- Manually trigger sitemap regeneration
+- View generated sitemap URLs
+- Access the sitemap index overview
+
+---
+
+## Permission Combinations
+
+Common permission setups for different roles:
+
+| Role | Access Settings |
+|------|-----------------|
+| **Content Editor** | ✅ |
+| **Senior Editor** | ✅ |
+| **SEO Manager** | ✅ |
+| **Viewer** | ❌ |
+
+**Content Editor / Senior Editor / SEO Manager** - Can view sitemap settings and regenerate sitemaps when content is updated.
+
+**Viewer** - Cannot access sitemap settings page.
+
+---
+
+## Super Admin Role
+
+:::info Automatic Access
+The **Super Admin** role has all permissions enabled by default and cannot be modified.
+:::
+
+---
+
+## Testing Permissions
+
+To verify permissions are configured correctly:
+
+1. Create a test user with the configured role
+2. Log in as that user
+3. Navigate to **Webtools → Sitemap**
+4. Verify you can access the settings page
+
+:::tip
+Restart Strapi and clear your browser cache after making permission changes.
+:::
+
+---
+
+## Troubleshooting
+
+**Webtools menu not visible:**
+- Verify the role has "Access the plugin settings" permission enabled
+- Log out and log back in
+- Clear browser cache
+
+**Cannot regenerate sitemap:**
+- Verify the user has "Access the plugin settings" permission
+- Check server logs for generation errors
+- Ensure content types have published content with URL aliases
+
+**Permission changes not applying:**
+- Verify you clicked "Save" after modifying permissions
+- Restart Strapi server
+- Have the user log out and log back in
+- Clear browser cache and cookies
diff --git a/packages/docs/docs/addons/sitemap/getting-started/api-permissions.md b/packages/docs/docs/addons/sitemap/getting-started/api-permissions.md
new file mode 100644
index 00000000..bc6bc4d3
--- /dev/null
+++ b/packages/docs/docs/addons/sitemap/getting-started/api-permissions.md
@@ -0,0 +1,156 @@
+---
+sidebar_label: 'API Permissions'
+displayed_sidebar: webtoolsSitemapSidebar
+slug: /addons/sitemap/api-permissions
+---
+
+# 🔐 API Permissions
+
+The Sitemap addon exposes sitemap XML files publicly by default. No permission configuration is required for standard usage.
+
+---
+
+## Public Sitemap Access
+
+The sitemap XML files are automatically accessible to the public:
+
+- `/sitemap.xml` - Main sitemap or sitemap index
+- `/sitemap/[name].xml` - Individual sitemaps (when using sitemap index)
+
+:::info Automatic Configuration
+These endpoints are automatically enabled during bootstrap for the **Public** role. No manual permission configuration is needed.
+:::
+
+---
+
+## Testing Sitemap Access
+
+### Test Main Sitemap
+
+```bash
+curl "http://localhost:1337/sitemap.xml"
+```
+
+**Expected response:**
+```xml
+
+
+
+ https://example.com/page
+ 2025-01-15
+
+
+
+```
+
+### Test Sitemap Index
+
+If you have multiple sitemaps configured:
+
+```bash
+curl "http://localhost:1337/sitemap.xml"
+```
+
+**Expected response:**
+```xml
+
+
+
+ https://example.com/sitemap/articles.xml
+ 2025-01-15
+
+
+
+```
+
+---
+
+## Advanced: Restricting Sitemap Access
+
+If you need to restrict sitemap access (e.g., for staging environments), you can use middleware or routes customization.
+
+### Option 1: Using Middleware
+
+Create a custom middleware in `src/middlewares/sitemap-auth.js`:
+
+```javascript
+module.exports = (config, { strapi }) => {
+ return async (ctx, next) => {
+ if (ctx.request.url.startsWith('/sitemap')) {
+ // Add your custom authorization logic
+ const token = ctx.request.headers['x-sitemap-token'];
+
+ if (token !== process.env.SITEMAP_ACCESS_TOKEN) {
+ return ctx.unauthorized('Invalid sitemap access token');
+ }
+ }
+
+ await next();
+ };
+};
+```
+
+Register in `config/middlewares.js`:
+
+```javascript
+module.exports = [
+ // ... other middlewares
+ 'global::sitemap-auth',
+];
+```
+
+### Option 2: Using API Tokens
+
+For programmatic access (e.g., SEO tools, monitoring services), you can create read-only API tokens.
+
+1. Go to **Strapi Admin → Settings → API Tokens**
+2. Click **Create new API Token**
+3. Configure the token:
+ - **Name**: "SEO Tool Access"
+ - **Token type**: Read-only
+ - **Token duration**: Unlimited or as needed
+
+4. Use the token with `Authorization` header:
+
+```bash
+curl -H "Authorization: Bearer YOUR_API_TOKEN" \
+ "http://localhost:1337/sitemap.xml"
+```
+
+:::tip For Build-Time Access
+If you're fetching sitemaps during static site generation (Next.js, Gatsby), use API tokens stored in environment variables to access Strapi during builds.
+:::
+
+---
+
+## robots.txt Configuration
+
+The sitemap location should be declared in your `robots.txt` file. See the [robots.txt guide](/addons/sitemap/robots-txt) for configuration details.
+
+---
+
+## Troubleshooting
+
+**404 Not Found:**
+- Verify the sitemap addon is installed and enabled
+- Check that at least one content type with webtools is published
+- Ensure sitemap has been generated (manually or via cron)
+
+**Empty sitemap:**
+- Verify content is published (not draft)
+- Check "Exclude drafts" setting is properly configured
+- Ensure URL aliases are generated for content
+
+**CORS issues:**
+- Configure CORS in `config/middlewares.js` if accessing from browsers:
+```javascript
+module.exports = [
+ // ...
+ {
+ name: 'strapi::cors',
+ config: {
+ origin: ['http://localhost:3000', 'https://your-frontend.com'],
+ },
+ },
+];
+```
diff --git a/packages/docs/docs/addons/sitemap/getting-started/troubleshooting.md b/packages/docs/docs/addons/sitemap/getting-started/troubleshooting.md
new file mode 100644
index 00000000..bfe1167b
--- /dev/null
+++ b/packages/docs/docs/addons/sitemap/getting-started/troubleshooting.md
@@ -0,0 +1,149 @@
+---
+sidebar_label: 'Troubleshooting'
+displayed_sidebar: webtoolsSitemapSidebar
+slug: /addons/sitemap/troubleshooting
+---
+
+# 🔧 Troubleshooting
+
+Common issues and solutions when working with the Sitemap addon.
+
+---
+
+## Generation Issues
+
+### Invalid URL error (500)
+```
+TypeError [ERR_INVALID_URL]: Invalid URL
+```
+
+**Cause:** The hostname setting is missing the protocol prefix.
+
+**Solution:** Ensure hostname includes protocol prefix in your sitemap settings:
+- ✅ Correct: `http://localhost:1337` or `https://example.com`
+- ❌ Wrong: `localhost:1337` or `example.com`
+
+Go to **Webtools → Sitemap → Settings** and update the hostname field.
+
+---
+
+### Generate sitemap button stuck
+
+**Problem:** UI becomes unresponsive after clicking "Generate sitemap" button.
+
+**Cause:** Usually occurs after a sitemap generation error (such as incorrect hostname format).
+
+**Solution:** Hard refresh your browser to reset the interface state:
+- **Windows/Linux:** `Ctrl + Shift + R` or `Ctrl + F5`
+- **Mac:** `Cmd + Shift + R`
+
+After refreshing, fix the underlying issue (e.g., hostname format) before generating again.
+
+---
+
+### Router permissions error
+
+**Problem:** 500 error when generating sitemap, even with correct hostname format.
+
+**Cause:** The sitemap generator needs access to the Webtools router endpoint to fetch content.
+
+**Solution:** Enable router permissions for the Public role:
+
+1. Go to **Settings → Users & Permissions plugin → Roles**
+2. Select **Public** role
+3. Scroll to **Webtools** section
+4. Check **Router: find**
+5. Click **Save**
+
+See the [API Permissions documentation](/webtools/addons/sitemap/api-permissions) for more details.
+
+---
+
+### Empty sitemap generated
+
+**Problem:** Sitemap generates successfully but contains no URLs.
+
+**Possible causes:**
+- Content is in draft status (not published)
+- URL aliases not generated for content
+- Content type doesn't have Webtools enabled
+- "Exclude drafts" setting is enabled but content is considered draft
+
+**Solution:**
+1. Verify content is **published** (not draft)
+2. Go to **Webtools → All URLs** and check if URL aliases exist
+3. If no aliases exist, use the bulk generate feature
+4. Verify content type has Webtools enabled in schema
+5. Check **Webtools → Sitemap → Settings** and review "Exclude drafts" setting
+
+---
+
+## Configuration Issues
+
+### Sitemap not accessible
+
+**Problem:** Getting 404 when accessing `/sitemap.xml` or `/sitemap/index.xml`.
+
+**Solution:**
+- Verify the sitemap addon is installed and enabled
+- Ensure at least one URL bundle or custom URL is configured
+- Generate the sitemap manually via admin panel
+- Restart Strapi server
+
+---
+
+### Confused about "Default Language URL Type"?
+
+**Problem:** Not sure which option to choose in the bundle settings.
+
+This setting controls how URLs for different locales appear in your sitemap for multilingual content.
+
+**Options explained:**
+
+| Option | Default Language URL | Other Language URL | Use When |
+|--------|---------------------|-------------------|----------|
+| **Disabled** | `/about` | `/about` | Single language site, or all locales use same URL format |
+| **Default language URL of bundles** | `/en/about` | `/nl/about` | You want all languages (including default) to have locale prefixes |
+| **Other** | `/about` | `/nl/about` | Only non-default languages should have locale prefixes |
+
+**Example:**
+If your default language is English and you choose "Other":
+- English page: `https://example.com/about`
+- Dutch page: `https://example.com/nl/about`
+
+---
+
+## Performance Issues
+
+### Sitemap generation takes too long
+
+**Problem:** Sitemap generation times out or takes several minutes.
+
+**Possible causes:**
+- Too many URLs in a single sitemap (exceeds 50,000 limit)
+- Large number of content entries
+- Complex URL pattern processing
+
+**Solution:**
+1. Use [sitemap indexes](/webtools/addons/sitemap/sitemap-index) to split large sitemaps
+2. Adjust the `limit` setting in configuration to reduce URLs per sitemap
+3. Enable [cron-based generation](/webtools/addons/sitemap/configuration/cron) instead of manual generation
+4. Consider using [auto-generate on content update](/webtools/addons/sitemap/configuration/auto-generate) for incremental updates
+
+See [Configuration: Limit](/webtools/addons/sitemap/configuration/limit) for details on managing large sitemaps.
+
+---
+
+## Still Having Issues?
+
+1. **Check server logs** for detailed error messages
+2. **Restart Strapi** after configuration changes
+3. **Clear browser cache** if UI behaves unexpectedly
+4. **Verify permissions** are correctly set (see [API Permissions](/webtools/addons/sitemap/api-permissions))
+
+If problems persist, check the [GitHub issues](https://github.com/pluginpal/strapi-webtools/issues) or create a new issue with:
+- Strapi version
+- Webtools version
+- Sitemap addon version
+- Error messages from server logs
+- Steps to reproduce the issue
diff --git a/packages/docs/docs/addons/sitemap/getting-started/usage.md b/packages/docs/docs/addons/sitemap/getting-started/usage.md
index a6b1050e..634903a1 100644
--- a/packages/docs/docs/addons/sitemap/getting-started/usage.md
+++ b/packages/docs/docs/addons/sitemap/getting-started/usage.md
@@ -4,6 +4,9 @@ displayed_sidebar: webtoolsSitemapSidebar
slug: /addons/sitemap/usage
---
+import ThemedImage from '@theme/ThemedImage';
+import useBaseUrl from '@docusaurus/useBaseUrl';
+
# 💡 Usage
With this plugin you have full control over which URLs you add to your sitemap XML. Go to the admin section of the plugin and start adding URLs. Here you will find that there are two ways to add URLs to the sitemap. With **URL bundles** and **Custom URLs**.
@@ -16,12 +19,35 @@ An URL bundle is a set of URLs grouped by type. If you set up an URL bundle, all
URLs coming from a URL bundle will get the following XML attributes:
-- ``
-- ``
-- ``
-- ``
+- `` - The URL location
+- `` - Last modification date (automatically set from Strapi)
+- `` - Relative importance (0.1 - 1.0)
+- `` - How often search engines should crawl
+
+
-
+### Bundle Settings
+
+When configuring a URL bundle, you can set:
+
+| Setting | Options | Description |
+|---------|---------|-------------|
+| **Priority** | `0.1` - `1.0` | Relative importance of URLs in this bundle. Higher priority (e.g., `0.8` or `1.0`) suggests these URLs are more important. Default is typically `0.5`. |
+| **Change frequency** | `always`, `hourly`, `daily`, `weekly`, `monthly`, `yearly`, `never` | Hint to search engines about how often these URLs change. Does not guarantee crawl frequency. |
+
+:::tip Multiple Bundles
+You can add the same content type multiple times with different settings. For example:
+- **Bundle 1**: English articles with `daily` updates and `priority: 0.8`
+- **Bundle 2**: Dutch articles with `weekly` updates and `priority: 0.6`
+
+This allows fine-grained control over how different content and locales appear in your sitemap.
+:::
## Custom URLs
A custom URL is meant to add URLs to the sitemap which are not managed in Strapi. It might be that you have custom route like `/account` that is hardcoded in your front-end. If you'd want to add such a route (URL) to the sitemap you can add it as a custom URL.
@@ -32,7 +58,13 @@ Custom URLs will get the following XML attributes:
- ``
- ``
-
+
## Generate
After you've successfully configured your sitemap it's time to generate it. You can generate the sitemap manually by clicking the 'Generate sitemap' button in the admin panel.
diff --git a/packages/docs/docs/addons/sitemap/settings/introduction.md b/packages/docs/docs/addons/sitemap/settings/introduction.md
index a5811ab0..88978c8c 100644
--- a/packages/docs/docs/addons/sitemap/settings/introduction.md
+++ b/packages/docs/docs/addons/sitemap/settings/introduction.md
@@ -4,7 +4,16 @@ displayed_sidebar: webtoolsSitemapSidebar
slug: /addons/sitemap/settings
---
+import ThemedImage from '@theme/ThemedImage';
+import useBaseUrl from '@docusaurus/useBaseUrl';
+
# Settings
Settings can be changed in the admin section of the plugin. In the last tab (Settings) you will find the settings as described below.
-
+
diff --git a/packages/docs/docs/api/rest.md b/packages/docs/docs/api/rest.md
index 99848ef6..d39bd8ea 100644
--- a/packages/docs/docs/api/rest.md
+++ b/packages/docs/docs/api/rest.md
@@ -14,6 +14,19 @@ The plugin exposes a couple of REST API endpoints that you can use to implement
Use Public role or API Tokens as per Strapi defaults.
+### Permissions
+
+:::danger Permissions Required
+Before you can use the router and url-alias endpoints publicly, you need to configure the **find** permissions. Without proper permissions, you'll get a **403 Forbidden** error.
+
+**Quick Setup in Settings > Users & Permissions > Roles > Public:**
+- `webtools.url-alias.find`
+- `webtools.router.find`
+- For each enabled content type: `[content-type].find`
+
+See the [API Permissions](/api-permissions) guide for detailed instructions on setting up permissions, including API tokens and content-type permissions.
+:::
+
## Router
Probably the most important endpoint of the plugin is it's router endpoint.
@@ -156,17 +169,3 @@ The query parameter `?url_path=` does not work correctly. Always use the full fi
-## Permissions
-
-Before you can use the router and url-alias endpoints publicly, you need to configure the *find* permissions.
-
-### Quick Setup
-
-Enable in **Settings > Users & Permissions > Roles > Public**:
-- `webtools.url-alias.find`
-- `webtools.router.find`
-
-For each enabled content type, also enable:
-- `[content-type].find`
-
-See [Permissions](/permissions) for a complete explanation of all three permission levels that need to be configured.
diff --git a/packages/docs/docs/cli/setup-license.md b/packages/docs/docs/cli/setup-license.md
index 4f1df7d7..c42212d0 100644
--- a/packages/docs/docs/cli/setup-license.md
+++ b/packages/docs/docs/cli/setup-license.md
@@ -8,10 +8,83 @@ slug: /cli/setup-license
## Overview
-If you've purchased a license for the premium features of Webtools you can use this CLI to setup the configuration for proper installation and license validation. The CLI will ask you to input your license key which will be added to the `.npmrc` and `.env` files.
+If you've purchased a license for the premium features of Webtools, or want to start a free trial, you can use this CLI to setup the configuration for proper installation and license validation. The CLI will ask you to input your license key which will be added to the `.npmrc` (or `.yarnrc.yml` for Yarn v2+) and `.env` files.
## Usage
-```
+```bash
npx webtools-cli setup-license
```
+
+## License Setup Options
+
+When you run the setup command, you'll be presented with three options:
+
+### 1. Yes, use my license
+
+Select this option if you already have a purchased license key. You'll be prompted to:
+- Enter your license key
+- The CLI will automatically create/update:
+ - `.env` file with `WEBTOOLS_LICENSE_KEY=your-key`
+ - `.npmrc` file (for npm/pnpm/Yarn v1) or `.yarnrc.yml` file (for Yarn v2+) with registry configuration
+
+### 2. Get me a trial
+
+Select this option to start a **7-day free trial** of the Essential plan. The trial includes:
+- [Redirects addon](/webtools/addons/redirects)
+- [Links addon](/webtools/addons/links)
+
+#### Trial Process
+
+1. The CLI will display a link to start your free trial
+2. Visit the link to complete the checkout process
+3. After checkout, you'll receive your trial license key
+4. Return to the CLI and select "Yes" when asked "Got your license key?"
+5. Enter your license key to complete the setup
+
+:::tip
+Remember: You can cancel within 7 days to ensure your trial remains free.
+:::
+
+### 3. Skip
+
+Select this option if you want to continue without setting up a license. You'll have access to:
+- Core Webtools features (URL aliases and patterns)
+- [Sitemap addon](/webtools/addons/sitemap) (free)
+
+## What Gets Created
+
+The setup process creates/updates the following files:
+
+### .env file
+
+```
+WEBTOOLS_LICENSE_KEY=your-license-key-here
+```
+
+### .npmrc file (npm/pnpm/Yarn v1)
+
+```
+@pluginpal:registry=https://npm.pluginpal.io
+//npm.pluginpal.io/:_authToken=your-license-key-here
+always-auth=true
+```
+
+### .yarnrc.yml file (Yarn v2+)
+
+```yaml
+npmScopes:
+ pluginpal:
+ npmPublishRegistry: https://npm.pluginpal.io
+ npmRegistryServer: https://npm.pluginpal.io
+ npmAlwaysAuth: true
+ npmAuthIdent: "token"
+ npmAuthToken: "your-license-key-here"
+```
+
+## Next Steps
+
+After setting up your license, follow the installation instructions for the addons you want to use:
+
+- [Redirects addon installation](/webtools/addons/redirects/installation)
+- [Links addon installation](/webtools/addons/links/installation)
diff --git a/packages/docs/docs/configuration/introduction.md b/packages/docs/docs/configuration/introduction.md
index 2ae9d43e..573e0f09 100644
--- a/packages/docs/docs/configuration/introduction.md
+++ b/packages/docs/docs/configuration/introduction.md
@@ -36,16 +36,6 @@ export default ({ env }) => ({
| `slugify` | function | `kebabCase(deburr(toLower()))` | Transform field values into URL-safe slugs (converts "My Title" to "my-title") |
| `unique_per_locale` | boolean | `false` | Allow same URL alias across different locales |
-## URL bundle settings (sitemap)
-
-When configuring sitemap URL bundles, each bundle supports:
-
-| Setting | Options | Description |
-|---------|---------|-------------|
-| **Change frequency** | `hourly`, `daily`, `weekly`, `monthly`, `yearly` | How often search engines should crawl these URLs |
-| **Priority** | `0.1` - `1.0` | Relative importance of URLs in this bundle |
-| **Default language URL type** | `Disabled`, `Default language URL of bundles`, `Other` | How default locale appears in URLs |
-
:::tip Pattern tokens
Available tokens for URL patterns: `[documentId]`, `[locale]`, `[pluralName]`, and any field from your content type. Type `[` in the pattern field to see all available options.
:::
diff --git a/packages/docs/docs/getting-started/admin-permissions.md b/packages/docs/docs/getting-started/admin-permissions.md
new file mode 100644
index 00000000..cfdc9e2d
--- /dev/null
+++ b/packages/docs/docs/getting-started/admin-permissions.md
@@ -0,0 +1,117 @@
+---
+sidebar_label: 'Admin Permissions'
+displayed_sidebar: webtoolsSidebar
+slug: /admin-permissions
+---
+
+import ThemedImage from '@theme/ThemedImage';
+import useBaseUrl from '@docusaurus/useBaseUrl';
+
+# 🔐 Admin Panel Permissions
+
+Configure granular permissions to control what administrators can do with Webtools in the Strapi admin panel.
+
+---
+
+## Configuration
+
+To configure permissions for a role:
+
+1. Go to **Strapi Admin → Settings → Administration Panel → Roles**
+2. Choose the role (e.g., **Author**, **Editor**)
+3. Under **Plugins** → **Webtools** enable the permissions you need
+4. Click **Save**
+
+
+
+---
+
+## Available Permissions
+
+The following table lists all available permissions for Webtools in the admin panel:
+
+| Permission | Description |
+|------------|-------------|
+| **Access the overview page** | Gives access to the main Webtools overview page at `/plugins/webtools` |
+| **Access the URL alias list** | Allows to view and manage all URL aliases created for content |
+| **Access the URL alias patterns** | Allows to configure URL pattern templates (list, create, edit) |
+| **Access the URL alias sidebar** | Shows the Webtools panel in the Content Manager sidebar when editing content |
+
+---
+
+## Permission Combinations
+
+Common permission setups for different roles:
+
+| Role | Overview | URL Alias List | URL Patterns | Sidebar |
+|------|----------|----------------|--------------|---------|
+| **Content Editor** | ❌ | ✅ | ❌ | ✅ |
+| **Senior Editor** | ✅ | ✅ | ❌ | ✅ |
+| **Admin** | ✅ | ✅ | ✅ | ✅ |
+| **Viewer** | ❌ | ✅ | ❌ | ❌ |
+
+**Content Editor** - Can view URLs when editing content and see the URL alias list, but cannot modify patterns or access the overview page.
+
+**Senior Editor** - Can access the overview page and manage URL aliases, but cannot modify URL patterns to prevent accidental changes to URL generation rules.
+
+**Admin** - Has full access to all Webtools features including URL pattern management.
+
+**Viewer** - Can only view the URL alias list in read-only mode.
+
+---
+
+## Super Admin Role
+
+:::info Automatic Access
+The **Super Admin** role has all permissions enabled by default and cannot be modified.
+:::
+
+:::tip RBAC Conditions
+For non-Super-Admin roles, you can click the **Settings** button next to permissions to add conditional access rules (e.g., "can edit when user is creator"). See [Strapi RBAC documentation](https://docs.strapi.io/dev-docs/configurations/rbac) for details.
+:::
+
+---
+
+## Testing Permissions
+
+To verify permissions are configured correctly:
+
+1. Create a test user with the configured role
+2. Log in as that user
+3. Navigate to **Webtools** in the admin panel
+4. Verify the available pages and actions match the configured permissions
+
+:::tip
+Restart Strapi and clear your browser cache after making permission changes.
+:::
+
+---
+
+## Troubleshooting
+
+**Webtools menu not visible:**
+- Verify the role has at least one Webtools permission enabled
+- Log out and log back in
+- Clear browser cache
+
+**URL alias sidebar not showing in Content Manager:**
+- Check that "Access the URL alias sidebar" permission is enabled
+- Verify the content-type has Webtools enabled in its schema
+- Refresh the page
+
+**Cannot access URL patterns page:**
+- Verify "Access the URL alias patterns" permission is enabled for the role
+- Check that the user's role is not disabled
+- Clear browser cache
+
+**Permission changes not applying:**
+- Verify you clicked "Save" after modifying permissions
+- Restart Strapi server
+- Have the user log out and log back in
+- Clear browser cache and cookies
diff --git a/packages/docs/docs/getting-started/api-permissions.md b/packages/docs/docs/getting-started/api-permissions.md
new file mode 100644
index 00000000..01f3ea0b
--- /dev/null
+++ b/packages/docs/docs/getting-started/api-permissions.md
@@ -0,0 +1,248 @@
+---
+sidebar_label: 'API Permissions'
+displayed_sidebar: webtoolsSidebar
+slug: /api-permissions
+---
+
+import ThemedImage from '@theme/ThemedImage';
+import useBaseUrl from '@docusaurus/useBaseUrl';
+
+# 🔐 API Permissions
+
+Webtools exposes API endpoints that your frontend application uses to fetch content by URL path. This requires proper permissions configuration.
+
+:::danger Required for Frontend
+Without the proper permissions, you'll get a **403 Forbidden** error when calling:
+- `GET /api/webtools/router?path=...`
+- `GET /api/webtools/url-alias`
+:::
+
+---
+
+## 1. Content-Type Permissions
+
+For each content-type where you've enabled Webtools, you need to enable the **find** permission.
+
+### Configuration Steps
+
+1. Go to **Strapi Admin → Settings → Users & Permissions plugin → Roles**
+2. Select the role (e.g., **Public** or **Authenticated**)
+3. Under **Application** you'll find your enabled content-types (e.g., `page`, `article`)
+4. Check **Find** (and **Find One** if desired)
+5. Click **Save**
+
+
+
+### What it enables
+
+- Allows the router endpoint to return content data for your content-types
+- Required for fetching content by URL path via `/api/webtools/router`
+
+---
+
+## 2. Webtools Plugin Permissions
+
+Enable the Webtools API endpoints for your frontend application.
+
+### Configuration Steps
+
+1. In the same role (e.g., **Public**) scroll to the **Webtools** section
+2. Check:
+ - **Router: find**
+ - **URL Alias: find**
+3. Click **Save**
+
+
+
+### What it enables
+
+| Permission | Endpoint | Description |
+|------------|----------|-------------|
+| **Router: find** | `GET /api/webtools/router?path=...` | Allows to fetch content by URL path for routing in frontend applications |
+| **URL Alias: find** | `GET /api/webtools/url-alias` | Allows to fetch all URL aliases for generating static routes |
+
+---
+
+## Access via API Tokens
+
+In addition to the Users & Permissions plugin (for public and authenticated users), you can use **API Tokens** for programmatic access to Webtools endpoints.
+
+### When to use API Tokens
+
+- **Build-time data fetching**: Static site generators (Next.js, Gatsby, etc.)
+- **Server-to-server communication**: Backend services fetching content by URL
+- **CI/CD pipelines**: Automated testing or validation
+- **Development tools**: Local development scripts fetching routes
+
+### Creating an API Token
+
+1. Go to **Strapi Admin → Settings → API Tokens**
+2. Click **Create new API Token**
+3. Configure the token:
+ - **Name**: e.g., "Frontend Build Token" or "Webtools API Access"
+ - **Description**: Optional description of the token's purpose
+ - **Token duration**: Unlimited, 7 days, 30 days, or 90 days
+ - **Token type**: Choose based on your needs:
+ - **Read-only**: Can only fetch data (recommended for webtools)
+ - **Full access**: Can create, update, and delete (use with caution)
+ - **Custom**: Fine-grained permissions (see below)
+
+4. Click **Save** and copy the generated token immediately (it won't be shown again)
+
+### Configuring Custom Permissions for API Tokens
+
+For better security, use **Custom** token type with specific permissions:
+
+1. Select **Custom** as Token type
+2. Enable permissions for your content-types:
+ - Under each content-type: **find** and **findOne**
+3. Scroll to **Webtools** section
+4. Enable:
+ - **Router: find**
+ - **URL Alias: find**
+
+:::tip Security Best Practice
+Use **Read-only** tokens or **Custom** tokens with only find permissions enabled for frontend applications. Never expose tokens with write permissions in client-side code.
+:::
+
+### Using the API Token
+
+Include the token in the `Authorization` header when making requests:
+
+```bash
+# Fetch content by URL path
+curl -H "Authorization: Bearer YOUR_API_TOKEN" \
+ "http://localhost:1337/api/webtools/router?path=/about-us"
+
+# Fetch all URL aliases
+curl -H "Authorization: Bearer YOUR_API_TOKEN" \
+ "http://localhost:1337/api/webtools/url-alias"
+```
+
+**Next.js example (server-side):**
+```javascript
+// app/[...slug]/page.tsx
+export async function generateStaticParams() {
+ const response = await fetch('https://your-strapi.com/api/webtools/url-alias', {
+ headers: {
+ 'Authorization': `Bearer ${process.env.STRAPI_API_TOKEN}`,
+ },
+ });
+ const aliases = await response.json();
+
+ return aliases.data.map((alias) => ({
+ slug: alias.attributes.url_path.split('/').filter(Boolean),
+ }));
+}
+
+export default async function Page({ params }) {
+ const path = '/' + params.slug.join('/');
+
+ const response = await fetch(
+ `https://your-strapi.com/api/webtools/router?path=${path}`,
+ {
+ headers: {
+ 'Authorization': `Bearer ${process.env.STRAPI_API_TOKEN}`,
+ },
+ }
+ );
+
+ const data = await response.json();
+ // Render your page...
+}
+```
+
+**Important:** Store API tokens in environment variables (`.env.local`), never commit them to version control.
+
+---
+
+## Testing API Access
+
+### Test with Public/Authenticated role
+
+```bash
+# Without authentication (requires Public role permissions)
+curl "http://localhost:1337/api/webtools/router?path=/about-us"
+
+# With user JWT token (requires Authenticated role permissions)
+curl -H "Authorization: Bearer USER_JWT_TOKEN" \
+ "http://localhost:1337/api/webtools/router?path=/about-us"
+```
+
+### Test with API Token
+
+```bash
+curl -H "Authorization: Bearer YOUR_API_TOKEN" \
+ "http://localhost:1337/api/webtools/router?path=/about-us"
+```
+
+**Expected response:**
+```json
+{
+ "data": {
+ "id": 1,
+ "documentId": "abc123",
+ "title": "About Us",
+ "content": "...",
+ // ... other content fields
+ },
+ "meta": {
+ "contentType": "api::page.page"
+ }
+}
+```
+
+:::tip
+Restart Strapi after making permission changes and clear your browser cache if needed.
+:::
+
+---
+
+## Troubleshooting
+
+**403 Forbidden Error:**
+- Verify the correct role (Public/Authenticated) has permissions enabled for:
+ - Content-type **find** permission
+ - Webtools **Router: find** permission
+ - Webtools **URL Alias: find** permission (if using that endpoint)
+- If using API token, verify it's valid and has correct permissions
+- Restart Strapi after permission changes
+- Check that the token hasn't expired
+
+**API Token not working:**
+- Ensure token is included in `Authorization: Bearer TOKEN` header
+- Verify token hasn't expired
+- Check token type has necessary permissions (not Read-only for write operations)
+- Regenerate token if needed
+
+**Content returns empty:**
+- Verify content is published (not draft)
+- Check that URL alias exists for the content
+- Ensure content-type has Webtools enabled in schema
+- Verify content has a valid `url_alias` relation
+
+**CORS issues in frontend:**
+- Configure CORS in `config/middlewares.js`:
+```javascript
+module.exports = [
+ // ...
+ {
+ name: 'strapi::cors',
+ config: {
+ origin: ['http://localhost:3000', 'https://your-frontend.com'],
+ },
+ },
+];
+```
diff --git a/packages/docs/docs/getting-started/installation.md b/packages/docs/docs/getting-started/installation.md
index 8b1c4aca..d8d35f31 100644
--- a/packages/docs/docs/getting-started/installation.md
+++ b/packages/docs/docs/getting-started/installation.md
@@ -23,6 +23,11 @@ To install the plugin run the following command in your Strapi project directory
npx webtools-cli install
```
+:::note Package names
+- **webtools-cli** - Interactive installer that sets up Webtools
+- **strapi-plugin-webtools** - The actual Strapi plugin (installed by the CLI)
+:::
+
### Command Line Interface (installer)
During installation the Webtools CLI guides you through a short wizard:
@@ -68,4 +73,45 @@ After successful installation you have to rebuild the admin UI so it'll include
### Post-install checklist
- Enable Webtools per content type → see [Usage](/webtools/usage)
-- Review Roles & Permissions → see [Permissions](/webtools/permissions)
+- Review API Permissions → see [API Permissions](/webtools/api-permissions)
+- Review Admin Panel Permissions → see [Admin Permissions](/webtools/admin-permissions)
+
+## Updating Webtools
+
+### Update to latest version
+
+To update Webtools to the latest version, use your package manager:
+
+
+
+ ```
+ yarn upgrade strapi-plugin-webtools
+ ```
+
+
+ ```
+ npm update strapi-plugin-webtools
+ ```
+
+
+
+After updating, rebuild the admin UI:
+
+
+
+ ```
+ yarn build
+ yarn develop
+ ```
+
+
+ ```
+ npm run build
+ npm run develop
+ ```
+
+
+
+:::tip Enable additional content types
+To enable Webtools for additional content types after installation, see the [Usage documentation](/webtools/usage#enabling-webtools).
+:::
diff --git a/packages/docs/docs/getting-started/permissions.md b/packages/docs/docs/getting-started/permissions.md
deleted file mode 100644
index 15e3d3b9..00000000
--- a/packages/docs/docs/getting-started/permissions.md
+++ /dev/null
@@ -1,75 +0,0 @@
----
-sidebar_label: 'Permissions'
-displayed_sidebar: webtoolsSidebar
-slug: /permissions
----
-
-# 🔐 Role-Based Access Control (RBAC)
-
-After installation, review Webtools permissions per role in Settings so your front-end can access the required endpoints.
-
-Without the proper permissions, you'll get a **403 Forbidden** error when calling:
-- `GET /api/webtools/router?path=…`
-- `GET /api/webtools/url-alias`
-
-Below are the three permission categories you need to configure.
-
----
-
-## 1. Content-Type "find" permissions
-
-For each content-type where you've enabled Webtools, you need to open up the standard **find** permission.
-
-1. Go to **Strapi Admin → Settings → Users & Permissions plugin → Roles**.
-2. Select the role (e.g., **Public**).
-3. Under **Application** you'll find your enabled content-types (e.g., `page`, `article`).
-4. Check **Find** (and **Find One** if desired).
-5. Click **Save**.
-
-
-
----
-
-## 2. Webtools plugin permissions
-
-Enable the Webtools endpoints for your front-end:
-
-1. In the same role (e.g., **Public**) scroll to the **Webtools** section.
-2. Check:
- - **Router: find**
- - **URL Alias: find**
-3. Click **Save**.
-
-
-
----
-
-## 3. Admin Panel roles
-
-Want your editors/admins to manage Webtools settings? Configure:
-
-1. Go to **Strapi Admin → Settings → Administration Panel → Roles**.
-2. Choose the role (e.g., **Author**).
-3. Under **Plugins** → **Webtools** enable the permissions you need:
- - **Access the URL alias list**
- - **Access the URL alias patterns**
- - **Access the URL alias sidebar**
-4. Click **Save**.
-
-
-
----
-
-## Test your permissions
-
-After saving:
-
-```bash
-curl "http://localhost:1337/api/webtools/router?path=/about-page"
-```
-
-You should now receive data instead of a 403 error.
-
-:::tip
-Restart Strapi after making changes and clear the cache if necessary.
-:::
diff --git a/packages/docs/docs/getting-started/troubleshooting.md b/packages/docs/docs/getting-started/troubleshooting.md
index 2e1017ab..2c63bbd8 100644
--- a/packages/docs/docs/getting-started/troubleshooting.md
+++ b/packages/docs/docs/getting-started/troubleshooting.md
@@ -26,10 +26,82 @@ Multiple warnings about unmet peer dependencies during installation.
**Solution:** These warnings are normal and won't affect functionality. The plugin will work correctly despite these warnings.
+## License Issues
+
+### License key activation is not valid
+```
+error: [webtools]: License key activation is not valid. Remove the activation_id from your package.json to issue a new activation for this project.
+```
+
+This error occurs when the stored license activation is no longer valid. The `activation_id` is stored in your `package.json` under `strapi.webtools.activation_id`. This can happen when:
+
+- You moved the project to a different machine
+- You reinstalled dependencies or changed the project structure
+- Your license has expired or been deactivated
+- You've reached the maximum number of activations for your license
+
+**Solution:** Remove the activation ID and restart Strapi to trigger a new activation:
+
+1. Open your `package.json` file
+2. Find the `strapi.webtools.activation_id` field (located inside the `strapi` object)
+3. Remove the entire `activation_id` field and its value
+4. Save the file
+5. Restart your Strapi server
+
+The plugin will automatically create a new activation on the next startup.
+
+**Example:**
+
+Before:
+```json
+{
+ "name": "my-strapi-project",
+ "version": "1.0.0",
+ "strapi": {
+ "uuid": "...",
+ "webtools": {
+ "activation_id": "..."
+ }
+ }
+}
+```
+
+After:
+```json
+{
+ "name": "my-strapi-project",
+ "version": "1.0.0",
+ "strapi": {
+ "uuid": "...",
+ "webtools": {}
+ }
+}
+```
+
+:::tip
+If you continue to experience activation issues after removing the `activation_id`, ensure your license key is correctly set in the `.env` file:
+```
+WEBTOOLS_LICENSE_KEY=your-license-key-here
+```
+
+You can also re-run the license setup:
+```bash
+npx webtools-cli setup-license
+```
+:::
+
## Pattern & URL Issues
### URL is incorrect
-The Webtools plugin applies it's own slugify function to your URLs. That means that if you have already have a slugified field, which you then use in an URL pattern, it will be slugified again, potentially causing incorrect URLs. If you want you can disable the slugify function of Webtools by updating the slugify configuration.
+
+Webtools applies its own slugify function to URL patterns. If you're using an already-slugified field in your pattern, it will be slugified twice, resulting in incorrect URLs.
+
+**Example problem:**
+- Field value: `my-blog-post` (already slugified)
+- Pattern: `/blog/[title]`
+- Result: `/blog/my--blog--post` (double slugified)
+
+**Solution:** Disable the slugify function in your Webtools configuration if you're using pre-slugified fields.
See [slugify configuration docs](/configuration/slugify)
@@ -46,33 +118,6 @@ Some content types require locale selection when creating patterns.
**Explanation:** Multi-language content types need locale-specific patterns. This is normal behavior for internationalized content.
-### Multiple content type bundles
-Content types can be selected multiple times in sitemap bundles.
-
-**Use case:** Each bundle can have different settings (change frequency, priority, locale-specific configurations).
-
-## Sitemap Issues
-
-### Invalid URL error (500)
-```
-TypeError [ERR_INVALID_URL]: Invalid URL
-```
-
-**Solution:** Ensure hostname includes protocol prefix:
-- ✅ Correct: `http://localhost:1337`
-- ❌ Wrong: `localhost:1337`
-
-### Generate sitemap button stuck
-UI becomes unresponsive after sitemap generation error (usually caused by incorrect hostname format).
-
-**Solution:** Hard refresh browser (Ctrl+R) to reset the interface state.
-
-### Router permissions error
-500 error when generating sitemap, even with correct URL format.
-
-**Solution:** Enable router permissions in **Settings > Users & Permissions > Public**:
-- `webtools.router.find`
-
## API Issues
### Returns all URLs instead of one
@@ -114,25 +159,6 @@ Origin null is not allowed by Access-Control-Allow-Origin
}
```
-## Configuration Issues
-
-### Default Language URL Type
-Controls how the default locale appears in URLs:
-
-- **Disabled**: All URLs use same format `/path`
-- **Default language URL of bundles**: Default locale gets `/en/path`, others `/nl/path`
-- **Other**: Custom locale handling
-
-Choose based on your multilingual URL structure needs.
-
-### URL Bundle Configuration
-Each content type can have multiple bundles with different:
-- Change frequency (hourly, daily, monthly)
-- Priority settings (0.1 - 1.0)
-- Locale-specific configurations
-
-This allows fine-grained control over how different content appears in your sitemap.
-
## Still Having Issues?
1. **Check server logs** for detailed error messages
diff --git a/packages/docs/docs/getting-started/url-alias.md b/packages/docs/docs/getting-started/url-alias.md
index daa01be1..cc630e8a 100644
--- a/packages/docs/docs/getting-started/url-alias.md
+++ b/packages/docs/docs/getting-started/url-alias.md
@@ -4,9 +4,18 @@ displayed_sidebar: webtoolsSidebar
slug: /url-alias
---
+import ThemedImage from '@theme/ThemedImage';
+import useBaseUrl from '@docusaurus/useBaseUrl';
+
# 💡 URL alias
At the core of the plugin is URL alias. It's the idea that every page of a given collection type represents a page in your website frontend. Each of those pages will have a unique URL path which can be altered on the backend. Then all those URL paths can be used in your frontend to setup dynamic routing.
See below a screenshot of the URL alias popup that's used to set the unique path of your page.
-
+
diff --git a/packages/docs/docs/getting-started/url-pattern.md b/packages/docs/docs/getting-started/url-pattern.md
index 49eef7d7..7155f4ab 100644
--- a/packages/docs/docs/getting-started/url-pattern.md
+++ b/packages/docs/docs/getting-started/url-pattern.md
@@ -4,12 +4,21 @@ displayed_sidebar: webtoolsSidebar
slug: /url-pattern
---
+import ThemedImage from '@theme/ThemedImage';
+import useBaseUrl from '@docusaurus/useBaseUrl';
+
# 🔌 URL pattern
To create dynamic URLs this plugin uses **URL patterns**. The URL pattern will be used to generate unique URLs based on the data available.
You can add URL patterns in the settings section of the plugin. For configuration details and fallbacks, see [Default pattern](/webtools/configuration/default-pattern) and [Slugify](/webtools/configuration/slugify).
-
+
```
/pages/[my-title-field]
@@ -29,4 +38,10 @@ The following field types are allowed in a pattern:
See below a screenshot of the URL pattern creation form in Strapi.
-
+
diff --git a/packages/docs/docs/getting-started/usage.md b/packages/docs/docs/getting-started/usage.md
index 28eec2f7..77c832f6 100644
--- a/packages/docs/docs/getting-started/usage.md
+++ b/packages/docs/docs/getting-started/usage.md
@@ -4,6 +4,9 @@ displayed_sidebar: webtoolsSidebar
slug: /usage
---
+import ThemedImage from '@theme/ThemedImage';
+import useBaseUrl from '@docusaurus/useBaseUrl';
+
# 💡 Usage
This plugin is specifically designed for usage in Strapi managed websites. Hence the name **web**tools. The plugin offers a variety of functionalities which you'll have to manually enable.
@@ -20,7 +23,13 @@ Once you enable Webtools for a content-type each entry of that type will get it'
See below a screenshot of how to enable webtools for a given collection type.
-
+
### Using the CLI
@@ -55,10 +64,32 @@ pluginOptions: {
After enabling Webtools for your content types:
1. **Create URL patterns** - See [URL pattern](/url-pattern) documentation
-2. **Bulk generate URLs** - Go to Webtools > All URLs to create aliases for existing content
-3. **Generate sitemap** - Configure and generate XML sitemap with your URLs
+2. **Bulk generate URLs** - Go to Webtools > All URLs to create aliases for existing content
+3. **[Optional] Install addons** - Add extra features like [Sitemap](/addons/sitemap), [Redirects](/addons/redirects), or [Links](/addons/links)
:::tip Pattern discovery
Type `[` in the pattern field to see available fields from your content type.
:::
+## Disabling Webtools
+
+:::warning Data Loss Warning
+Disabling Webtools for a content type will permanently delete all URL aliases associated with that content type. This action cannot be undone.
+:::
+
+When you disable Webtools:
+
+- `pluginOptions.webtools.enabled` is set to `false` in the schema
+- All URL aliases for this content type are deleted from the database
+
+To disable Webtools for a content type:
+
+1. Go to **Content-Type Builder**
+2. Select the content type
+3. Click **Edit**
+4. Go to **Advanced Settings** tab
+5. Uncheck **Webtools**
+6. Confirm the deletion warning
+
+The system will prompt you to confirm before deleting all paths.
+
diff --git a/packages/docs/sidebars.ts b/packages/docs/sidebars.ts
index fd65905e..395598ad 100644
--- a/packages/docs/sidebars.ts
+++ b/packages/docs/sidebars.ts
@@ -26,7 +26,8 @@ const sidebars = {
"getting-started/usage",
"getting-started/url-pattern",
"getting-started/url-alias",
- "getting-started/permissions",
+ "getting-started/api-permissions",
+ "getting-started/admin-permissions",
"getting-started/troubleshooting",
],
},
@@ -117,6 +118,9 @@ const sidebars = {
"addons/sitemap/getting-started/sitemap-index",
"addons/sitemap/getting-started/robots-txt",
"addons/sitemap/getting-started/cli",
+ "addons/sitemap/getting-started/api-permissions",
+ "addons/sitemap/getting-started/admin-permissions",
+ "addons/sitemap/getting-started/troubleshooting",
],
},
{
@@ -167,6 +171,8 @@ const sidebars = {
"addons/redirects/getting-started/introduction",
"addons/redirects/getting-started/installation",
"addons/redirects/getting-started/usage",
+ "addons/redirects/getting-started/api-permissions",
+ "addons/redirects/getting-started/admin-permissions",
],
},
{
diff --git a/packages/docs/static/img/assets/add_new_pattern.png b/packages/docs/static/img/assets/add_new_pattern-dark.png
similarity index 100%
rename from packages/docs/static/img/assets/add_new_pattern.png
rename to packages/docs/static/img/assets/add_new_pattern-dark.png
diff --git a/packages/docs/static/img/assets/addons/links/ckeditor.png b/packages/docs/static/img/assets/addons/links/ckeditor-light.png
similarity index 100%
rename from packages/docs/static/img/assets/addons/links/ckeditor.png
rename to packages/docs/static/img/assets/addons/links/ckeditor-light.png
diff --git a/packages/docs/static/img/assets/addons/links/ckeditor-link-modal.png b/packages/docs/static/img/assets/addons/links/ckeditor-link-modal-light.png
similarity index 100%
rename from packages/docs/static/img/assets/addons/links/ckeditor-link-modal.png
rename to packages/docs/static/img/assets/addons/links/ckeditor-link-modal-light.png
diff --git a/packages/docs/static/img/assets/addons/links/link-component.png b/packages/docs/static/img/assets/addons/links/link-component-light.png
similarity index 100%
rename from packages/docs/static/img/assets/addons/links/link-component.png
rename to packages/docs/static/img/assets/addons/links/link-component-light.png
diff --git a/packages/docs/static/img/assets/addons/links/link-custom-field.png b/packages/docs/static/img/assets/addons/links/link-custom-field-light.png
similarity index 100%
rename from packages/docs/static/img/assets/addons/links/link-custom-field.png
rename to packages/docs/static/img/assets/addons/links/link-custom-field-light.png
diff --git a/packages/docs/static/img/assets/addons/links/webtools-pro-link-addon-options.png b/packages/docs/static/img/assets/addons/links/webtools-pro-link-addon-options-light.png
similarity index 100%
rename from packages/docs/static/img/assets/addons/links/webtools-pro-link-addon-options.png
rename to packages/docs/static/img/assets/addons/links/webtools-pro-link-addon-options-light.png
diff --git a/packages/docs/static/img/assets/addons/redirects/create-redirects.png b/packages/docs/static/img/assets/addons/redirects/create-redirects-light.png
similarity index 100%
rename from packages/docs/static/img/assets/addons/redirects/create-redirects.png
rename to packages/docs/static/img/assets/addons/redirects/create-redirects-light.png
diff --git a/packages/docs/static/img/assets/addons/redirects/redirects-overview.png b/packages/docs/static/img/assets/addons/redirects/redirects-overview-light.png
similarity index 100%
rename from packages/docs/static/img/assets/addons/redirects/redirects-overview.png
rename to packages/docs/static/img/assets/addons/redirects/redirects-overview-light.png
diff --git a/packages/docs/static/img/assets/addons/sitemap/URL-bundle.png b/packages/docs/static/img/assets/addons/sitemap/URL-bundle-light.png
similarity index 100%
rename from packages/docs/static/img/assets/addons/sitemap/URL-bundle.png
rename to packages/docs/static/img/assets/addons/sitemap/URL-bundle-light.png
diff --git a/packages/docs/static/img/assets/addons/sitemap/custom-url.png b/packages/docs/static/img/assets/addons/sitemap/custom-url-light.png
similarity index 100%
rename from packages/docs/static/img/assets/addons/sitemap/custom-url.png
rename to packages/docs/static/img/assets/addons/sitemap/custom-url-light.png
diff --git a/packages/docs/static/img/assets/addons/sitemap/settings.png b/packages/docs/static/img/assets/addons/sitemap/settings-light.png
similarity index 100%
rename from packages/docs/static/img/assets/addons/sitemap/settings.png
rename to packages/docs/static/img/assets/addons/sitemap/settings-light.png
diff --git a/packages/docs/static/img/assets/enable-webtools-dark.png b/packages/docs/static/img/assets/enable-webtools-dark.png
new file mode 100644
index 00000000..e38511b3
Binary files /dev/null and b/packages/docs/static/img/assets/enable-webtools-dark.png differ
diff --git a/packages/docs/static/img/assets/enable-webtools.png b/packages/docs/static/img/assets/enable-webtools-light.png
similarity index 100%
rename from packages/docs/static/img/assets/enable-webtools.png
rename to packages/docs/static/img/assets/enable-webtools-light.png
diff --git a/packages/docs/static/img/assets/permissions-admin-roles.png b/packages/docs/static/img/assets/permissions-admin-roles-dark.png
similarity index 100%
rename from packages/docs/static/img/assets/permissions-admin-roles.png
rename to packages/docs/static/img/assets/permissions-admin-roles-dark.png
diff --git a/packages/docs/static/img/assets/permissions-ct-find.png b/packages/docs/static/img/assets/permissions-ct-find-dark.png
similarity index 100%
rename from packages/docs/static/img/assets/permissions-ct-find.png
rename to packages/docs/static/img/assets/permissions-ct-find-dark.png
diff --git a/packages/docs/static/img/assets/permissions-webtools-find.png b/packages/docs/static/img/assets/permissions-webtools-find-dark.png
similarity index 100%
rename from packages/docs/static/img/assets/permissions-webtools-find.png
rename to packages/docs/static/img/assets/permissions-webtools-find-dark.png
diff --git a/packages/docs/static/img/assets/url-alias-dark.png b/packages/docs/static/img/assets/url-alias-dark.png
new file mode 100644
index 00000000..9c9841a0
Binary files /dev/null and b/packages/docs/static/img/assets/url-alias-dark.png differ
diff --git a/packages/docs/static/img/assets/url-alias.png b/packages/docs/static/img/assets/url-alias-light.png
similarity index 100%
rename from packages/docs/static/img/assets/url-alias.png
rename to packages/docs/static/img/assets/url-alias-light.png
diff --git a/packages/docs/static/img/assets/url_patterns.png b/packages/docs/static/img/assets/url_patterns-dark.png
similarity index 100%
rename from packages/docs/static/img/assets/url_patterns.png
rename to packages/docs/static/img/assets/url_patterns-dark.png
diff --git a/yarn.lock b/yarn.lock
index 6b008e33..fb65f6ed 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -11814,9 +11814,9 @@ __metadata:
linkType: hard
"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001688, caniuse-lite@npm:^1.0.30001702":
- version: 1.0.30001713
- resolution: "caniuse-lite@npm:1.0.30001713"
- checksum: 10c0/f5468abfe73ce30e29cc8bde2ea67df2aab69032bdd93345e0640efefb76b7901c84fe1d28d591a797e65fe52fc24cae97060bb5552f9f9740322aff95ce2f9d
+ version: 1.0.30001754
+ resolution: "caniuse-lite@npm:1.0.30001754"
+ checksum: 10c0/d38709ab11abc36eea28068d241434eba925c4d3462916ccaa17a34a6227dfdeb58ab0e1eb614bab12fb393c7d527db392a0f477b48c33d70d8e466954f381ba
languageName: node
linkType: hard