Merge branch 'main' into main

This commit is contained in:
Mauricio Siu
2026-02-15 21:12:40 -06:00
committed by GitHub
35 changed files with 3457 additions and 257 deletions

1
.gitignore vendored
View File

@@ -6,6 +6,7 @@ node_modules
.pnp.js
.docker
# Local env files
.env
.env.local

View File

@@ -14,6 +14,8 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --filter=./apps/d
# Generate OpenAPI documentation from apps/docs/public/openapi.json
RUN pnpm --filter=./apps/docs run build:docs
# Generate templates
RUN pnpm --filter=./apps/docs run generate-templates
# Deploy only the dokploy app
ENV NODE_ENV=production

View File

@@ -78,6 +78,15 @@ _openapi:
- depth: 2
title: Notification test Lark Connection
url: '#notification-test-lark-connection'
- depth: 2
title: Notification create Pushover
url: '#notification-create-pushover'
- depth: 2
title: Notification update Pushover
url: '#notification-update-pushover'
- depth: 2
title: Notification test Pushover Connection
url: '#notification-test-pushover-connection'
- depth: 2
title: Notification get Email Providers
url: '#notification-get-email-providers'
@@ -133,9 +142,15 @@ _openapi:
id: notification-update-lark
- content: Notification test Lark Connection
id: notification-test-lark-connection
- content: Notification create Pushover
id: notification-create-pushover
- content: Notification update Pushover
id: notification-update-pushover
- content: Notification test Pushover Connection
id: notification-test-pushover-connection
- content: Notification get Email Providers
id: notification-get-email-providers
contents: []
---
<APIPage document={"./public/openapi.json"} operations={[{"method":"post","path":"/notification.createSlack"},{"method":"post","path":"/notification.updateSlack"},{"method":"post","path":"/notification.testSlackConnection"},{"method":"post","path":"/notification.createTelegram"},{"method":"post","path":"/notification.updateTelegram"},{"method":"post","path":"/notification.testTelegramConnection"},{"method":"post","path":"/notification.createDiscord"},{"method":"post","path":"/notification.updateDiscord"},{"method":"post","path":"/notification.testDiscordConnection"},{"method":"post","path":"/notification.createEmail"},{"method":"post","path":"/notification.updateEmail"},{"method":"post","path":"/notification.testEmailConnection"},{"method":"post","path":"/notification.remove"},{"method":"get","path":"/notification.one"},{"method":"get","path":"/notification.all"},{"method":"post","path":"/notification.receiveNotification"},{"method":"post","path":"/notification.createGotify"},{"method":"post","path":"/notification.updateGotify"},{"method":"post","path":"/notification.testGotifyConnection"},{"method":"post","path":"/notification.createNtfy"},{"method":"post","path":"/notification.updateNtfy"},{"method":"post","path":"/notification.testNtfyConnection"},{"method":"post","path":"/notification.createLark"},{"method":"post","path":"/notification.updateLark"},{"method":"post","path":"/notification.testLarkConnection"},{"method":"get","path":"/notification.getEmailProviders"}]} hasHead={true} />
<APIPage document={"./public/openapi.json"} operations={[{"method":"post","path":"/notification.createSlack"},{"method":"post","path":"/notification.updateSlack"},{"method":"post","path":"/notification.testSlackConnection"},{"method":"post","path":"/notification.createTelegram"},{"method":"post","path":"/notification.updateTelegram"},{"method":"post","path":"/notification.testTelegramConnection"},{"method":"post","path":"/notification.createDiscord"},{"method":"post","path":"/notification.updateDiscord"},{"method":"post","path":"/notification.testDiscordConnection"},{"method":"post","path":"/notification.createEmail"},{"method":"post","path":"/notification.updateEmail"},{"method":"post","path":"/notification.testEmailConnection"},{"method":"post","path":"/notification.remove"},{"method":"get","path":"/notification.one"},{"method":"get","path":"/notification.all"},{"method":"post","path":"/notification.receiveNotification"},{"method":"post","path":"/notification.createGotify"},{"method":"post","path":"/notification.updateGotify"},{"method":"post","path":"/notification.testGotifyConnection"},{"method":"post","path":"/notification.createNtfy"},{"method":"post","path":"/notification.updateNtfy"},{"method":"post","path":"/notification.testNtfyConnection"},{"method":"post","path":"/notification.createLark"},{"method":"post","path":"/notification.updateLark"},{"method":"post","path":"/notification.testLarkConnection"},{"method":"post","path":"/notification.createPushover"},{"method":"post","path":"/notification.updatePushover"},{"method":"post","path":"/notification.testPushoverConnection"},{"method":"get","path":"/notification.getEmailProviders"}]} hasHead={true} />

View File

@@ -21,6 +21,9 @@ _openapi:
- depth: 2
title: Registry test Registry
url: '#registry-test-registry'
- depth: 2
title: Registry test Registry By Id
url: '#registry-test-registry-by-id'
structuredData:
headings:
- content: Registry create
@@ -35,9 +38,11 @@ _openapi:
id: registry-one
- content: Registry test Registry
id: registry-test-registry
- content: Registry test Registry By Id
id: registry-test-registry-by-id
contents: []
---
{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
<APIPage document={"./public/openapi.json"} webhooks={[]} operations={[{"path":"/registry.create","method":"post"},{"path":"/registry.remove","method":"post"},{"path":"/registry.update","method":"post"},{"path":"/registry.all","method":"get"},{"path":"/registry.one","method":"get"},{"path":"/registry.testRegistry","method":"post"}]} showTitle={true} />
<APIPage document={"./public/openapi.json"} webhooks={[]} operations={[{"path":"/registry.create","method":"post"},{"path":"/registry.remove","method":"post"},{"path":"/registry.update","method":"post"},{"path":"/registry.all","method":"get"},{"path":"/registry.one","method":"get"},{"path":"/registry.testRegistry","method":"post"},{"path":"/registry.testRegistryById","method":"post"}]} showTitle={true} />

View File

@@ -3,6 +3,9 @@ title: Settings
full: true
_openapi:
toc:
- depth: 2
title: Settings get Web Server Settings
url: '#settings-get-web-server-settings'
- depth: 2
title: Settings reload Server
url: '#settings-reload-server'
@@ -93,6 +96,9 @@ _openapi:
- depth: 2
title: Settings get Ip
url: '#settings-get-ip'
- depth: 2
title: Settings update Server Ip
url: '#settings-update-server-ip'
- depth: 2
title: Settings get Open Api Document
url: '#settings-get-open-api-document'
@@ -143,6 +149,8 @@ _openapi:
url: '#settings-get-dokploy-cloud-ips'
structuredData:
headings:
- content: Settings get Web Server Settings
id: settings-get-web-server-settings
- content: Settings reload Server
id: settings-reload-server
- content: Settings clean Redis
@@ -203,6 +211,8 @@ _openapi:
id: settings-read-traefik-file
- content: Settings get Ip
id: settings-get-ip
- content: Settings update Server Ip
id: settings-update-server-ip
- content: Settings get Open Api Document
id: settings-get-open-api-document
- content: Settings read Traefik Env
@@ -240,4 +250,4 @@ _openapi:
{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
<APIPage document={"./public/openapi.json"} webhooks={[]} operations={[{"path":"/settings.reloadServer","method":"post"},{"path":"/settings.cleanRedis","method":"post"},{"path":"/settings.reloadRedis","method":"post"},{"path":"/settings.reloadTraefik","method":"post"},{"path":"/settings.toggleDashboard","method":"post"},{"path":"/settings.cleanUnusedImages","method":"post"},{"path":"/settings.cleanUnusedVolumes","method":"post"},{"path":"/settings.cleanStoppedContainers","method":"post"},{"path":"/settings.cleanDockerBuilder","method":"post"},{"path":"/settings.cleanDockerPrune","method":"post"},{"path":"/settings.cleanAll","method":"post"},{"path":"/settings.cleanMonitoring","method":"post"},{"path":"/settings.saveSSHPrivateKey","method":"post"},{"path":"/settings.assignDomainServer","method":"post"},{"path":"/settings.cleanSSHPrivateKey","method":"post"},{"path":"/settings.updateDockerCleanup","method":"post"},{"path":"/settings.readTraefikConfig","method":"get"},{"path":"/settings.updateTraefikConfig","method":"post"},{"path":"/settings.readWebServerTraefikConfig","method":"get"},{"path":"/settings.updateWebServerTraefikConfig","method":"post"},{"path":"/settings.readMiddlewareTraefikConfig","method":"get"},{"path":"/settings.updateMiddlewareTraefikConfig","method":"post"},{"path":"/settings.getUpdateData","method":"post"},{"path":"/settings.updateServer","method":"post"},{"path":"/settings.getDokployVersion","method":"get"},{"path":"/settings.getReleaseTag","method":"get"},{"path":"/settings.readDirectories","method":"get"},{"path":"/settings.updateTraefikFile","method":"post"},{"path":"/settings.readTraefikFile","method":"get"},{"path":"/settings.getIp","method":"get"},{"path":"/settings.getOpenApiDocument","method":"get"},{"path":"/settings.readTraefikEnv","method":"get"},{"path":"/settings.writeTraefikEnv","method":"post"},{"path":"/settings.haveTraefikDashboardPortEnabled","method":"get"},{"path":"/settings.haveActivateRequests","method":"get"},{"path":"/settings.toggleRequests","method":"post"},{"path":"/settings.isCloud","method":"get"},{"path":"/settings.isUserSubscribed","method":"get"},{"path":"/settings.health","method":"get"},{"path":"/settings.setupGPU","method":"post"},{"path":"/settings.checkGPUStatus","method":"get"},{"path":"/settings.updateTraefikPorts","method":"post"},{"path":"/settings.getTraefikPorts","method":"get"},{"path":"/settings.updateLogCleanup","method":"post"},{"path":"/settings.getLogCleanupStatus","method":"get"},{"path":"/settings.getDokployCloudIps","method":"get"}]} showTitle={true} />
<APIPage document={"./public/openapi.json"} webhooks={[]} operations={[{"path":"/settings.getWebServerSettings","method":"get"},{"path":"/settings.reloadServer","method":"post"},{"path":"/settings.cleanRedis","method":"post"},{"path":"/settings.reloadRedis","method":"post"},{"path":"/settings.reloadTraefik","method":"post"},{"path":"/settings.toggleDashboard","method":"post"},{"path":"/settings.cleanUnusedImages","method":"post"},{"path":"/settings.cleanUnusedVolumes","method":"post"},{"path":"/settings.cleanStoppedContainers","method":"post"},{"path":"/settings.cleanDockerBuilder","method":"post"},{"path":"/settings.cleanDockerPrune","method":"post"},{"path":"/settings.cleanAll","method":"post"},{"path":"/settings.cleanMonitoring","method":"post"},{"path":"/settings.saveSSHPrivateKey","method":"post"},{"path":"/settings.assignDomainServer","method":"post"},{"path":"/settings.cleanSSHPrivateKey","method":"post"},{"path":"/settings.updateDockerCleanup","method":"post"},{"path":"/settings.readTraefikConfig","method":"get"},{"path":"/settings.updateTraefikConfig","method":"post"},{"path":"/settings.readWebServerTraefikConfig","method":"get"},{"path":"/settings.updateWebServerTraefikConfig","method":"post"},{"path":"/settings.readMiddlewareTraefikConfig","method":"get"},{"path":"/settings.updateMiddlewareTraefikConfig","method":"post"},{"path":"/settings.getUpdateData","method":"post"},{"path":"/settings.updateServer","method":"post"},{"path":"/settings.getDokployVersion","method":"get"},{"path":"/settings.getReleaseTag","method":"get"},{"path":"/settings.readDirectories","method":"get"},{"path":"/settings.updateTraefikFile","method":"post"},{"path":"/settings.readTraefikFile","method":"get"},{"path":"/settings.getIp","method":"get"},{"path":"/settings.updateServerIp","method":"post"},{"path":"/settings.getOpenApiDocument","method":"get"},{"path":"/settings.readTraefikEnv","method":"get"},{"path":"/settings.writeTraefikEnv","method":"post"},{"path":"/settings.haveTraefikDashboardPortEnabled","method":"get"},{"path":"/settings.haveActivateRequests","method":"get"},{"path":"/settings.toggleRequests","method":"post"},{"path":"/settings.isCloud","method":"get"},{"path":"/settings.isUserSubscribed","method":"get"},{"path":"/settings.health","method":"get"},{"path":"/settings.setupGPU","method":"post"},{"path":"/settings.checkGPUStatus","method":"get"},{"path":"/settings.updateTraefikPorts","method":"post"},{"path":"/settings.getTraefikPorts","method":"get"},{"path":"/settings.updateLogCleanup","method":"post"},{"path":"/settings.getLogCleanupStatus","method":"get"},{"path":"/settings.getDokployCloudIps","method":"get"}]} showTitle={true} />

View File

@@ -10,6 +10,7 @@
"resend",
"gotify",
"ntfy",
"pushover",
"webhook"
]
}

View File

@@ -30,5 +30,6 @@ Dokploy supports the following notification providers:
6. **Resend**: Resend is a modern email API for developers to send transactional emails.
7. **Gotify**: Gotify is a self-hosted push notification service.
8. **Ntfy**: Ntfy is a simple HTTP-based pub-sub notification service.
8. **Pushover**: Pushover is a service for sending real-time notifications to Android, iOS, and desktop devices.
9. **Webhook**: Webhook is a generic webhook notification service.

View File

@@ -0,0 +1,27 @@
---
title: Pushover
description: 'Configure Pushover notifications for your applications.'
---
Pushover notifications are a great way to stay up to date with important events in your Dokploy panel. You can choose to receive notifications for specific events or all events.
## Pushover Notifications
To start receiving Pushover notifications, you need to fill the form with the following details:
- **Name**: Enter any name you want.
- **User Key**: Enter your Pushover user key. eg. `ub3de9kl2q...`
- **API Token**: Enter your Pushover application API token. eg. `a3d9k2q7m4...`
- **Priority**: Enter the priority of the notification (-2 to 2, default: 0).
- `-2`: Lowest priority (no sound/vibration)
- `-1`: Low priority (no sound/vibration)
- `0`: Normal priority (default)
- `1`: High priority (bypasses quiet hours)
- `2`: Emergency priority (requires acknowledgment)
For emergency priority (2), you must also provide:
- **Retry**: How often (in seconds) Pushover will retry the notification. Minimum 30 seconds.
- **Expire**: How long (in seconds) to keep retrying. Maximum 10800 seconds (3 hours).
To setup the Pushover notifications, you can read the [Pushover Documentation](https://pushover.net/api).

View File

@@ -36,11 +36,11 @@ The repo have everything you need, however you can follow the same idea for your
</Callout>
3. The repository already have a Dockerfile, so we will use that, in the case your application is different create your own Dockerfile is required for this guide.
4. We will use `Dockerhub` as an example, but you can use any container registry that you want.
5. Make sure to create the repository in the `Dockerhub` , `namespace` is your username and `repository` is `example`.
6. Create a new Github Actions workflow in `.github/workflows/deploy.yml`
7. Add the following code to the workflow:
2. The repository already have a Dockerfile, so we will use that, in the case your application is different create your own Dockerfile is required for this guide.
3. We will use `Dockerhub` as an example, but you can use any container registry that you want.
4. Make sure to create the repository in the `Dockerhub` , `namespace` is your username and `repository` is `example`.
5. Create a new Github Actions workflow in `.github/workflows/deploy.yml`
6. Add the following code to the workflow:
```yaml
name: Build Docker images
@@ -74,7 +74,7 @@ jobs:
namespace/example:latest
platforms: linux/amd64
```
8. Create your own Dockerfile, in this case we will use the `Dockerfile` from the repository.
7. Create your own Dockerfile, in this case we will use the `Dockerfile` from the repository.
```properties
FROM node:18-alpine AS base
@@ -103,14 +103,14 @@ EXPOSE 3000
CMD ["pnpm", "start"]
```
9. Now when you make a commit to your repository, the workflow will be triggered and the application will build and push to `Dockerhub`.
10. Now let's create application in Dokploy.
11. In `Source Type` select `Docker`
12. In the docker image field enter `namespace/example:latest`
13. Click on `Save`.
14. Click on `Deploy`.
15. Go to `Domains` and click `Dices` icon to generate a domain and the port set to `3000`.
16. Now you can access your application.
8. Now when you make a commit to your repository, the workflow will be triggered and the application will build and push to `Dockerhub`.
9. Now let's create application in Dokploy.
10. In `Source Type` select `Docker`
11. In the docker image field enter `namespace/example:latest`
12. Click on `Save`.
13. Click on `Deploy`.
14. Go to `Domains` and click `Dices` icon to generate a domain and the port set to `3000`.
15. Now you can access your application.
### Auto deploy

View File

@@ -0,0 +1,44 @@
---
title: Audit logs
description: Track user actions and changes for compliance and security
---
## What is logged
Typical events include:
- **Authentication** — Logins, logouts, failed attempts, SSO redirects.
- **Users and access** — User creation, updates, deletion, role changes, invite/revoke.
- **Resources** — Creation, update, and deletion of projects, applications, compose stacks, databases, domains, environment variables, and similar resources.
- **Deployments** — Deploy triggers, rollbacks, and related actions.
- **Settings** — Changes to organization, security, and whitelabel settings (where applicable).
Each entry usually includes:
- **Timestamp** (UTC)
- **Actor** (user ID, email, or service account)
- **Action** (e.g. `user.login`, `application.create`, `compose.deploy`)
- **Resource** (type and identifier)
- **Details** (e.g. old/new values or reason, when relevant)
- **IP address** (when available)
## Accessing audit logs
1. Go to **Settings** → **Audit logs** (or **Organization** → **Audit logs** in Enterprise).
2. Use filters by date range, user, action type, or resource.
3. Export results (e.g. CSV or JSON) for external tools or compliance reviews.
## Retention and storage
- Retention period and storage backend (e.g. database, external logging) depend on your Enterprise agreement.
- Configure retention and any archiving according to your compliance and security policies.
## Compliance
Audit logs help support:
- **SOC 2** — Evidence of access control and change management.
- **GDPR** — Documentation of access to and changes in personal data and configurations.
- **Internal policies** — Review of who changed what and when.
For retention, export formats, or integration with your SIEM or log pipeline, [contact us](https://dokploy.com/contact).

View File

@@ -0,0 +1,21 @@
---
title: Introduction
description: Enterprise features for SSO, whitelabeling, and audit logs
---
## What's included
- **Single Sign-On (SSO)** — Integrate with Auth0, Keycloak, or other OIDC/SAML providers.
{/* - **Whitelabeling** — Rebrand the UI with your logo, colors, and domain (self-hosted only) (). */}
{/* - **Audit logs** — Track user actions and changes for compliance and security. */}
More Enterprise features are on the way. [Contact us](https://dokploy.com/contact) if you want early access or have specific requirements.
## Contact us
For pricing and to enable Enterprise features on your instance, get in touch with our team:
**[Contact us →](https://dokploy.com/contact)**
We'll help you configure SSO, whitelabeling, and audit logs for your organization.

View File

@@ -0,0 +1,23 @@
---
title: License Keys
description: Activate and manage your Enterprise license
---
To use Enterprise features (SSO, whitelabeling, audit logs, and more), you need a valid license issued by the Dokploy team.
By default, all Dokploy instances run in the standard edition. If you are interested in switching to the Enterprise version, [contact us](https://dokploy.com/contact). Once you receive your license key, you can activate it in your instance.
## Activating your license
1. Go to **Settings** → **License** (or **Organization** → **License** in Enterprise).
2. Enter your license key and click **Activate**.
Your instance will then have access to Enterprise features for the duration of the license.
## How validation works
- The license is validated **every day** against our servers to verify that it is still valid.
- The **only data** used for validation is the **IP address** of your server. We check it against our license server to confirm that the key is valid and active for that server.
- No other data is sent or stored for license validation.
If your servers IP changes, or you have questions about your license, [contact us](https://dokploy.com/contact).

View File

@@ -0,0 +1,107 @@
---
title: Auth0
description: Configure SSO with Auth0 (OIDC or SAML)
---
<Tabs items={['SSO (OIDC)', 'SAML']}>
<Tab value="SSO (OIDC)">
## 1. Create an application in Auth0
1. Log in to the [Auth0 Dashboard](https://manage.auth0.com/).
2. Go to **Applications** → **Applications** → **Create Application**.
3. Choose **Regular Web Application** and create it.
4. Note your **Domain**, **Client ID**, and **Client Secret**.
## 2. Configure Dokploy
1. In Dokploy, go to **Settings** (or **Organization** / **Security** in Enterprise).
2. Enable **SSO** and choose **OpenID Connect**.
3. Enter:
- **Provider**: myorg-name-auth0 (Unique)
- **Issuer URL**: `https://YOUR_AUTH0_DOMAIN/` (Make sure add the trailing slash)
- **Domain**: the domain users use to authenticate via Auth0 (e.g. your organization domain like `acme.com`), not the Dokploy instance URL
- **Client ID**: from Auth0 application
- **Client Secret**: from Auth0 application
- **Scopes**: openid email profile
4. Save.
## 3. Configure Auth0
1. In your application, go to **Settings**.
2. Set **Allowed Callback URLs** to your Dokploy URL, for example:
- `https://your-dokploy-domain.com/api/auth/callback/myorg-name-auth0`
3. Set **Allowed Logout URLs** to:
- `https://your-dokploy-domain.com`
4. Set **Allowed Origins** to:
- `https://your-dokploy-domain.com`
5. Save changes.
## Troubleshooting (OIDC)
- **Redirect URI mismatch** — Ensure the callback URL in Dokploy matches exactly what is configured in Auth0 (including protocol and path).
- **Invalid client** — Double-check Client ID and Client Secret, and that the application is a web application.
- **Scopes** — Ensure Auth0 is configured to return `openid` and, if required, `email` and `profile`.
</Tab>
<Tab value="SAML">
## 1. Create a SAML application in Auth0
1. Log in to the [Auth0 Dashboard](https://manage.auth0.com/).
2. Go to **Applications** → **Applications** → **Create Application**.
3. Choose **Regular Web Application** and create it.
4. In the application, go to **Add Ons** → enable **SAML 2 Web App** and configure it, in the settings specify this callback URL: `https://your-dokploy-domain.com/api/auth/sso/saml2/callback/myorg-name-auth0-saml`.
5. Next & Save.
## 2. Configure Dokploy
1. In Dokploy, go to **Settings** (or **Organization** / **Security** in Enterprise).
2. Enable **SSO** and choose **SAML**.
3. Enter:
- **Provider**: myorg-name-auth0-saml (unique name for this provider)
- **Issuer URL**: the Auth0 SAML Entity ID / Issuer located in `Add Ons` tab called `SAML 2 Web App` called `Entity ID` (e.g. `urn:auth0:your-tenant:your-app`)
- **SSO URL**: the Auth0 SAML Single Sign-On URL located in `Add Ons` tab called `SAML 2 Web App` called `Single Sign-On URL` (e.g. `https://dev-ladsadb.us.auth0.com/samlp/wgJe9bWmwhVnuAC7eNtyUsiou4b6wxuf`)
- **Certificate**: download the certificate active (x509) from the `Add Ons` tab called `SAML 2 Web App` called `Identity Provider Certificate` and paste it in the `Certificate` field.
- **Federation Metadata XML**: copy the Identity Provider Metadata XML from the certificate active and paste it in the `Metadata XML` field.
- **Domain**: the domain users use to authenticate via Auth0 (e.g. your organization domain like `acme.com`), not the Dokploy instance URL
4. Save.
## 3. Configure Auth0 (SAML)
1. In your Auth0 SAML application, set the **Application Callback URL** (ACS URL) to your Dokploy SAML ACS URL, for example:
- `https://your-dokploy-domain.com/api/auth/sso/saml2/callback/myorg-name-auth0-saml`
2. In the **SAML 2 Web App** add-on, open **Settings** and paste the following JSON in the **Settings** (Application Settings) field. Replace `https://your-dokploy-domain.com` with your Dokploy base URL and `myorg-name-auth0-saml` with the **exact same provider name** you entered in Dokploy in step 2 (the callback URL path must match), so Dokploy can read email, display name, and other attributes:
```json
{
"audience": "https://your-dokploy-domain.com/saml/metadata",
"recipient": "https://your-dokploy-domain.com/api/auth/sso/saml2/callback/myorg-name-auth0-saml",
"destination": "https://your-dokploy-domain.com/api/auth/sso/saml2/callback/myorg-name-auth0-saml",
"signResponse": true,
"signAssertion": true,
"nameIdentifierFormat": "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress",
"nameIdentifierProbes": [
"email"
],
"mappings": {
"email": "email",
"displayName": "name",
"givenName": "given_name",
"surname": "family_name"
}
}
```
4. Save.
## Troubleshooting (SAML)
- **ACS URL mismatch** — Ensure the callback/ACS URL in Auth0 matches exactly what Dokploy provides (including protocol and path).
- **Certificate** — Use the full x509 certificate from Auth0 (PEM format); ensure no extra spaces or line breaks.
- **Entity ID** — The Entity ID in Dokploy must match the Issuer/Entity ID configured in Auth0.
</Tab>
</Tabs>
For help with your setup, [contact us](https://dokploy.com/contact).

View File

@@ -0,0 +1,88 @@
---
title: Azure AD (Microsoft Entra ID)
description: Configure SSO with Azure AD / Microsoft Entra ID (OIDC or SAML)
---
<Tabs items={['SSO (OIDC)', 'SAML']}>
<Tab value="SSO (OIDC)">
## 1. Register an application in Azure
1. Log in to the [Azure Portal](https://portal.azure.com/).
2. Go to **Microsoft Entra ID** (or **Azure Active Directory**) → **App registrations** → **New registration**.
3. Enter a **Name** (e.g. Dokploy), choose supported account types, and set **Redirect URI** to **Web** with a placeholder for now (e.g. `https://your-dokploy-domain.com/api/auth/callback/myorg-name-azure`).
4. Register and note the **Application (client) ID** and **Directory (tenant) ID**.
5. Go to **Certificates & secrets** → **New client secret**, create a secret and note its **Value** (you wont see it again).
6. The **Issuer URL** for OpenID Connect is: `https://login.microsoftonline.com/{tenant-id}/v2.0` (replace `{tenant-id}` with your Directory (tenant) ID). Some setups expect a trailing slash.
## 2. Configure Dokploy
1. In Dokploy, go to **Settings** (or **Organization** / **Security** in Enterprise).
2. Enable **SSO** and choose **OpenID Connect**.
3. Enter:
- **Provider**: myorg-name-azure (unique name for this provider)
- **Issuer URL**: `https://login.microsoftonline.com/YOUR_TENANT_ID/v2.0` (use your Directory (tenant) ID; add a trailing slash if required for discovery)
- **Domain**: the domain users use to authenticate via Azure AD (e.g. your organization domain like `acme.com`), not the Dokploy instance URL
- **Client ID**: the Application (client) ID from Azure
- **Client Secret**: the client secret value from Certificates & secrets
- **Scopes**: openid email profile
4. Save.
## 3. Configure Azure
1. In your app registration, go to **Authentication**.
2. Under **Web** → **Redirect URIs**, add:
- `https://your-dokploy-domain.com/api/auth/callback/myorg-name-azure`
3. Under **Front-channel logout URL** (optional), you can set:
- `https://your-dokploy-domain.com`
4. Go to **Token Configuration** and add optional claim, select **email**, **preferred_username** and **upn** from the list of claims.
5. Save.
## Troubleshooting (OIDC)
- **Redirect URI mismatch** — Ensure the callback URL in Dokploy matches exactly what is configured in Azure (including protocol and path). Use the same **Provider** value in the path (e.g. `.../api/auth/callback/myorg-name-azure`).
- **Invalid client** — Double-check Application (client) ID and client secret. Confirm the secret has not expired under **Certificates & secrets**.
- **Tenant** — Use the correct Directory (tenant) ID in the Issuer URL. For multi-tenant apps, you may use `common` instead of the tenant ID (e.g. `https://login.microsoftonline.com/common/v2.0`).
- **Scopes** — Ensure the app registration has the right API permissions (e.g. **OpenID permissions**, **User.Read**) if required for `openid`, `email`, and `profile`.
</Tab>
<Tab value="SAML">
## 1. Create an Enterprise Application (SAML) in Azure
1. Log in to the [Azure Portal](https://portal.azure.com/).
2. Go to **Microsoft Entra ID** → **Enterprise applications** → **New application** → **Create your own application** (or **Non-gallery application**).
3. Enter a **Name** (e.g. Dokploy) and create.
4. Go to **Single sign-on** → **SAML**.
5. Note the **Identifier (Entity ID)** and **Login URL** (SSO URL). Under **SAML Certificates**, download or copy the **Certificate (Base64)** (x509) and download the **Federation Metadata XML** file.
## 2. Configure Dokploy
1. In Dokploy, go to **Settings** (or **Organization** / **Security** in Enterprise).
2. Enable **SSO** and choose **SAML**.
3. Enter:
- **Provider**: myorg-name-azure-saml (unique name for this provider)
- **Issuer URL**: the Azure SAML Entity ID (Identifier) from the Enterprise application (eg. `https://sts.windows.net/YOUR_TENANT_ID/`).
- **SSO URL**: the Azure Login URL (Single Sign-On URL) (eg. `https://login.microsoftonline.com/YOUR_TENANT_ID/saml2`)
- **Certificate**: the IdP signing certificate (x509 Base64) from Azure
- **Federation Metadata XML**: the Federation Metadata XML file from Azure
- **Domain**: the domain users use to authenticate via Azure AD (e.g. your organization domain like `acme.com`), not the Dokploy instance URL
4. Save.
## 3. Configure Azure (SAML)
1. In your Enterprise application, go to **Single sign-on** → **SAML**.
2. Under **Basic SAML Configuration**, set **Identifier (Entity ID)** if required (SP Entity ID from Dokploy) (eg. `https://your-dokploy-instance.com`).
3. Set **Reply URL (Assertion Consumer Service URL)** to your Dokploy SAML ACS URL (eg. `https://your-dokploy-instance.com/api/auth/sso/saml2/callback/myorg-name-azure-saml`).
3. Save.
## Troubleshooting (SAML)
- **ACS URL mismatch** — Ensure the Reply URL (ACS) in Azure matches exactly what Dokploy provides (including protocol and path).
- **Certificate** — Use the Certificate (Base64) from Azure; paste as-is or convert to PEM if Dokploy expects PEM.
- **Entity ID** — The Entity ID in Dokploy must match the Identifier (Entity ID) of the Azure Enterprise application.
</Tab>
</Tabs>
For help with your setup, [contact us](https://dokploy.com/contact).

View File

@@ -0,0 +1,17 @@
---
title: Single Sign-On (SSO)
description: Configure SSO with Auth0, Keycloak, or other OIDC/SAML providers
---
Enterprise supports Single Sign-On via OpenID Connect (OIDC) and SAML. You can use Auth0, Keycloak, or any compatible identity provider.
Choose a provider below for step-by-step configuration:
- **[Auth0](/docs/core/enterprise/sso/auth0)** — Cloud identity platform
- **[Azure AD (Microsoft Entra ID)](/docs/core/enterprise/sso/azure)** — Microsoft's cloud identity platform
- **[Okta](/docs/core/enterprise/sso/okta)** — Cloud identity platform
- **[Keycloak](/docs/core/enterprise/sso/keycloak)** — Open-source identity and access management
You can also use any other OIDC/SAML provider by configuring the endpoints and flow manually.
For other OIDC/SAML providers, use the same endpoints and flow; [contact us](https://dokploy.com/contact) if you need help.

View File

@@ -0,0 +1,48 @@
---
title: Keycloak
description: Configure SSO with Keycloak
---
## 1. Create a client in Keycloak
1. Log in to your Keycloak Admin Console.
2. Select your realm (or create one).
3. Go to **Clients** → **Create client**.
4. Set **Client ID** (e.g. `my-client-id`) and **Client type** to **OpenID Connect**.
5. Set **Root URL** to your Dokploy base URL, e.g. `https://your-dokploy-domain.com`.
6. Save.
7. Open the client, set **Access type** to **confidential**, then open the **Credentials** tab and note the **Secret**.
8. From **Realm settings** → **OpenID Endpoint Configuration**, note the **Issuer** (e.g. `https://keycloak.example.com/realms/your-realm`).
## 2. Configure Dokploy
1. In Dokploy, go to **Settings** (or **Organization** / **Security** in Enterprise).
2. Enable **SSO** and choose **OpenID Connect**.
3. Enter:
- **Provider**: my-client-id (Unique)
- **Issuer URL**: your Keycloak realm URL (e.g. `https://keycloak.example.com/realms/your-realm`)
- **Domain**: the domain users use to authenticate via Keycloak (e.g. your organization domain like `acme.com`), not the Dokploy instance URL
- **Client ID**: my-client-id
- **Client Secret**: the secret from the Keycloak client Credentials tab
- **Scopes**: openid email profile
4. Save.
## 3. Configure Keycloak
1. In your Keycloak client, go to **Settings**.
2. Set **Valid redirect URIs** to your Dokploy callback URL, for example:
- `https://your-dokploy-domain.com/api/auth/callback/my-client-id`
3. Set **Valid post logout redirect URIs** to:
- `https://your-dokploy-domain.com`
4. Set **Allowed Origins** to:
- `https://your-dokploy-domain.com`
5. Save changes.
## Troubleshooting
- **Redirect URI mismatch** — Ensure the callback URL in Dokploy matches exactly what is configured in Keycloak (including protocol and path). Use the same **Provider** value in the path (e.g. `.../api/auth/callback/myorg-name-keycloak`).
- **Invalid client** — Double-check Client ID and Client Secret, and that the client is enabled and set to confidential access.
- **Scopes** — Ensure the client is configured to request `openid` and, if required, `email` and `profile`.
- **Attribute mapping** — If user email or name is missing, map Keycloak attributes (e.g. email, preferred_username) in Dokploy if your setup supports it.
For help with your setup, [contact us](https://dokploy.com/contact).

View File

@@ -0,0 +1,9 @@
{
"title": "SSO",
"pages": [
"auth0",
"azure",
"keycloak",
"okta"
]
}

View File

@@ -0,0 +1,80 @@
---
title: Okta
description: Configure SSO with Okta (OIDC or SAML)
---
<Tabs items={['SSO (OIDC)', 'SAML']}>
<Tab value="SSO (OIDC)">
## 1. Create an application in Okta
1. Log in to the [Okta Admin Console](https://login.okta.com/) (or your Okta domain).
2. Go to **Applications** → **Applications** → **Create App Integration**.
3. Choose **OIDC - OpenID Connect** and **Web Application**, then create it.
4. Note your **Client ID** and **Client Secret** (under **General** or **Client credentials**).
5. Note your Okta **domain** (e.g. `https://your-domain.okta.com`) and, if using a custom authorization server, its **issuer** (e.g. `https://your-domain.okta.com/oauth2/default`) or go to **Security** → **API** → **Authorization Servers** and note the **Issuer** (e.g. `https://your-domain.okta.com`).
## 2. Configure Dokploy
1. In Dokploy, go to **Settings** (or **Organization** / **Security** in Enterprise).
2. Enable **SSO** and choose **OpenID Connect**.
3. Enter:
- **Provider**: myorg-name-okta (unique name for this provider)
- **Issuer URL**: your Okta issuer URL (e.g. `https://your-domain.okta.com`)
- **Domain**: the domain users use to authenticate via Okta (e.g. your organization domain like `acme.com`), not the Dokploy instance URL
- **Client ID**: from the Okta application
- **Client Secret**: from the Okta application
- **Scopes**: openid email profile
4. Save.
## 3. Configure Okta
1. In your Okta application, go to **General** (or **Sign-in** / **Assignments** as needed).
2. Set **Sign-in redirect URIs** to your Dokploy callback URL, for example:
- `https://your-dokploy-domain.com/api/auth/callback/myorg-name-okta`
3. Set **Sign-out redirect URIs** (optional) to:
- `https://your-dokploy-domain.com`
4. Under **Trusted Origins**, add your Dokploy URL as an origin (e.g. `https://your-dokploy-domain.com`) if required for CORS.
5. Save.
## Troubleshooting (OIDC)
- **Redirect URI mismatch** — Ensure the callback URL in Dokploy matches exactly what is configured in Okta (including protocol and path). Use the same **Provider** value in the path (e.g. `.../api/auth/callback/myorg-name-okta`).
- **Invalid client** — Double-check Client ID and Client Secret, and that the application is a Web Application with the correct grant types (e.g. Authorization Code).
- **Issuer URL** — Use the full issuer URL for your authorization server (e.g. `https://your-domain.okta.com`).
- **Scopes** — Ensure the Okta authorization server is configured to allow `openid`, and if needed `email` and `profile`.
</Tab>
<Tab value="SAML">
## 1. Create a SAML application in Okta
1. Log in to the [Okta Admin Console](https://login.okta.com/) (or your Okta domain).
2. Go to **Applications** → **Applications** → **Create App Integration**.
3. Choose **SAML 2.0** and create it.
4. Enter an **App name** (e.g. Dokploy). Under **Configure SAML**, in the Single sign-on URL field, set the SAML ACS URL (eg. `https://your-dokploy-instance.com/api/auth/sso/saml2/callback/myorg-name-okta-saml`) and in the Audience URI (SP Entity ID) field, set the SP Entity ID (eg. `https://your-dokploy-instance.com`).
5. Next & Save.
## 2. Configure Dokploy
1. In Dokploy, go to **Settings** (or **Organization** / **Security** in Enterprise).
2. Enable **SSO** and choose **SAML**.
3. Enter:
- **Provider**: myorg-name-okta-saml (unique name for this provider)
- **Issuer URL**: the Okta Identity Provider issuer (Entity ID) located in `Sign On` tab called `Issuer` (eg. `http://www.okta.com/exkzq3acyuEtIuNrW697`)
- **SSO URL**: the Okta Identity Provider single sign-on URL located in `Sign On` tab called `Single sign-on URL` (eg. `https://trial-2804699.okta.com/app/trial-2802699_something/exkzqi3cyuEtIuNrW697/sso/saml`)
- **Certificate**: go to `Signing Certificate` tab and download the certificate active (x509) and paste it in the `Certificate` field.
- **Federation Metadata XML**: copy the idp metadata XML from the certificate active and paste it in the `Metadata XML` field.
- **Domain**: the domain users use to authenticate via Okta (e.g. your organization domain like `acme.com`), not the Dokploy instance URL
4. Save.
## Troubleshooting (SAML)
- **ACS URL mismatch** — Ensure the Single sign-on URL (ACS) in Okta matches exactly what Dokploy provides (including protocol and path).
- **Certificate** — Use the x509 certificate from Oktas IdP metadata (PEM or Base64); ensure it is the one used to sign assertions.
- **Entity ID** — The Entity ID in Dokploy must match the Identity Provider issuer in Okta.
</Tab>
</Tabs>
For help with your setup, [contact us](https://dokploy.com/contact).

View File

@@ -0,0 +1,37 @@
---
title: Whitelabeling
description: Rebrand Dokploy with your logo, colors, and domain
---
## What you can customize
- **Logo** — Header and login logo.
- **Favicon** — Browser tab icon.
- **Colors** — Primary color and accent (e.g. buttons, links).
- **Custom domain** — Serve the app from your own domain (e.g. `deploy.yourcompany.com`).
## Configuration
Whitelabel settings are managed in the Enterprise admin area (or via environment variables, depending on your deployment).
1. Go to **Settings** → **Whitelabel** (or equivalent in your Enterprise setup).
2. Upload your **logo** (recommended: SVG or PNG, transparent background).
3. Upload your **favicon** (e.g. ICO or PNG).
4. Set **primary color** and **accent color** (hex codes).
5. If using a custom domain, configure your reverse proxy (e.g. Traefik, Nginx) and DNS to point to your Dokploy instance, and set the **base URL** in Dokploy to match.
## Custom domain
1. Create a CNAME (or A) record pointing your domain to the server or load balancer where Dokploy runs.
2. Configure TLS (e.g. Let's Encrypt) on your reverse proxy for that hostname.
3. In Dokploy, set the **Application URL** (or equivalent) to `https://your-domain.com`.
4. Restart or reload Dokploy so it uses the new base URL for redirects and links.
## Best practices
- Use high-resolution logos (e.g. 2x) for sharp display on retina screens.
- Keep primary and accent colors accessible (sufficient contrast for text and buttons).
- Test login and main flows after changing logo and colors to ensure nothing is broken or hard to read.
For help enabling or configuring whitelabeling, [contact us](https://dokploy.com/contact).

View File

@@ -372,3 +372,34 @@ curl -sSL https://dokploy.com/install.sh | sh
export ADVERTISE_ADDR=192.168.1.100
curl -sSL https://dokploy.com/install.sh | sh
```
## Updating Traefik Manually
Dokploy does not update the Traefik container automatically when you upgrade. This is intentional to avoid unexpected downtime for your services. If you need a newer Traefik version (for example, due to a breaking change or security fix), you can update it manually.
1. Remove the existing Traefik container.
2. Create a new container with the desired Traefik image version and the same configuration.
3. Connect the new container to the Dokploy network.
Example (replace `v3.6.7` with the version you want):
```bash
docker rm -f dokploy-traefik
docker run -d \
--name dokploy-traefik \
--restart always \
-v /etc/dokploy/traefik/traefik.yml:/etc/traefik/traefik.yml \
-v /etc/dokploy/traefik/dynamic:/etc/dokploy/traefik/dynamic \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-p 80:80/tcp \
-p 443:443/tcp \
-p 443:443/udp \
traefik:v3.6.7
docker network connect dokploy-network dokploy-traefik
```
<Callout type='warn'>
**Breaking changes:** Some Traefik versions introduce breaking changes that may not be compatible with the configuration and structure Dokploy uses. Before upgrading, check the [Traefik release notes](https://github.com/traefik/traefik/releases) and [Dokploy releases](https://github.com/Dokploy/dokploy/releases) for any announced breaking changes. Using an incompatible version can cause routing issues (e.g. 404s for applications using domains).
</Callout>

View File

@@ -35,7 +35,6 @@
"applications",
"docker-compose",
"databases",
"templates",
"(examples)",
"auto-deploy",
"schedule-jobs",
@@ -49,11 +48,17 @@
"remote-servers/deployments",
"remote-servers/security",
"remote-servers/validate",
"---Advanced---",
"cluster",
"---Enterprise---",
"enterprise/index",
"enterprise/license-keys",
"enterprise/sso",
"enterprise/whitelabeling",
"enterprise/audit-logs",
"---Guides---",
"guides/cloudflare-tunnels",
"guides/tailscale",
"guides/ec2-instructions",
"---Advanced---",
"cluster"
"guides/ec2-instructions"
]
}

View File

@@ -1,122 +0,0 @@
---
title: Open Source Templates
description: Deploy open source templates with Dokploy
---
By default we include a set of templates, that you can use to spin up templates quickly. You can also create your own templates.
## Templates
The following templates are available (100):
- **Appwrite**: End-to-end backend server for Web, Mobile, Native, or Backend apps with user authentication, database, storage, and more.
- **Outline**: Self-hosted knowledge base and documentation platform.
- **Supabase**: The open-source Firebase alternative with a dedicated Postgres database for web, mobile, and AI applications.
- **Pocketbase**: Open-source backend for your next SaaS and Mobile app in 1 file.
- **Plausible**: Open-source, privacy-focused, self-hosted web analytics platform.
- **Calcom**: Open-source alternative to Calendly for creating scheduling and booking services.
- **Grafana**: Open-source platform for data visualization and monitoring.
- **Directus**: API-first, open-source headless CMS for building custom backends.
- **Baserow**: Open-source database management tool.
- **Budibase**: Open-source low-code platform for building forms, portals, and approval apps.
- **Ghost**: Professional publishing platform built on Node.js.
- **Uptime Kuma**: Free and open-source monitoring tool.
- **n8n**: Open-source low-code platform for automating workflows.
- **Wordpress**: Free and open-source CMS for publishing websites.
- **Odoo**: Free and open-source business management software.
- **Appsmith**: Open-source platform for building internal tools.
- **Excalidraw**: Open-source online diagramming tool.
- **Documenso**: Open-source alternative to DocuSign.
- **NocoDB**: Airtable alternative for databases.
- **Meilisearch**: Free and open-source search engine.
- **Phpmyadmin**: Web interface for MySQL/MariaDB management.
- **Rocketchat**: Open-source web chat platform.
- **Minio**: Open-source object storage server.
- **Metabase**: Open-source business intelligence tool.
- **Glitchtip**: Simple, open-source error tracking.
- **Open WebUI**: Open-source ChatGPT alternative.
- **Listmonk**: Self-hosted newsletter manager.
- **Double Zero**: Self-hostable SES dashboard.
- **Umami**: Privacy-focused analytics alternative.
- **Jellyfin**: Free software media system.
- **Teable**: No-code database with spreadsheet interface.
- **Zipline**: ShareX/file upload server.
- **Soketi**: Open-source WebSockets server.
- **Aptabase**: Self-hosted analytics platform.
- **Typebot**: Open-source chatbot builder.
- **Gitea**: Self-hosted software development service.
- **Roundcube**: Open-source webmail software.
- **File Browser**: Web-based file manager.
- **Tolgee**: Web-based localization platform.
- **Portainer**: Container management tool.
- **InfluxDB**: Time-series data platform.
- **Infisical**: Configuration and secrets manager.
- **Docmost**: Collaborative wiki software.
- **Vaultwarden**: Bitwarden-compatible server.
- **Hi.events**: Event management platform.
- **Windows/MacOS**: Dockerized operating systems.
- **Coder**: Cloud development environment.
- **Stirling PDF**: PDF tools suite.
- **Lobe Chat**: Modern AI chat framework.
- **Peppermint**: API development platform.
- **Windmill**: Workflow and internal apps platform.
- **Activepieces**: No-code automation tool.
- **InvoiceShelf**: Self-hosted invoicing system.
- **Postiz**: Content management platform.
- **Slash**: Bookmarking and link shortener.
- **Discord Tickets**: Support ticket bot.
- **Nextcloud AIO**: File storage and collaboration.
- **Blender**: 3D creation suite.
- **HeyForm**: Conversational form builder.
- **Chatwoot**: Customer engagement platform.
- **Discourse**: Modern forum software.
- **Immich**: Photo/video backup solution.
- **Twenty CRM**: Modern CRM alternative.
- **YOURLS**: URL shortening service.
- **Ryot**: Media tracking platform.
- **PhotoPrism**: AI-powered photos app.
- **Ontime**: Event rundown manager.
- **Trigger.dev**: Event-driven application platform.
- **Browserless**: Headless browser automation.
- **draw.io**: Diagramming application.
- **Kimai**: Time-tracking application.
- **Logto**: Identity management platform.
- **Penpot**: Open-source design tool.
- **Huly**: Project management platform.
- **Unsend**: Email service platform.
- **Langflow**: Low-code AI application builder.
- **Elasticsearch**: Search and analytics engine.
- **OneDev**: Git server with CI/CD.
- **Unifi Network**: Network management platform.
- **GLPI**: Service management software.
- **Checkmate**: Server monitoring tool.
- **Gotenberg**: PDF generation API.
- **Actual Budget**: Privacy-focused finance app.
- **Conduit/Conduwuit**: Matrix chat servers.
- **Cloudflared**: Cloudflare Tunnel daemon.
- **CouchDB**: Document-oriented database.
- **IT Tools**: Developer utilities collection.
- **Superset**: Data visualization platform.
- **Glance/Homarr**: Dashboard solutions.
- **ERPNext**: Open-source ERP software.
- **Maybe**: Finance tracking application.
- **Spacedrive**: Cross-platform file manager.
- **AList**: Multi-storage file manager.
- **Answer**: Q&A platform.
- **Shlink**: URL shortener.
- **Frappe HR**: HR & Payroll software.
- **Formbricks**: Survey platform.
- **Trilium**: Note-taking application.
- **Convex**: Reactive database platform.
For an up to date list of available template you can visit [Dokploy templates website](https://templates.dokploy.com/).
## Create your own template
We accept contributions to upload new templates to the dokploy repository.
Make sure to follow the guidelines for creating a template:
[Steps to create your own template](https://github.com/Dokploy/templates)
[^1]: Please note that if you're self-hosting a mail server you need port 25 to be open for SMTP (Mail Transmission Protocol that allows you to send and receive) to work properly. Some VPS providers like [Hetzner](https://docs.hetzner.com/cloud/servers/faq/#why-can-i-not-send-any-mails-from-my-server) block this port by default for new clients.

View File

@@ -1,3 +1,3 @@
{
"pages": ["core", "cli", "api"]
"pages": ["core", "cli", "api", "templates"]
}

View File

@@ -1,6 +1,7 @@
import { APIPage } from "@/lib/source";
import { Callout } from "fumadocs-ui/components/callout";
import { ImageZoom } from "fumadocs-ui/components/image-zoom";
import { Tab, Tabs } from "fumadocs-ui/components/tabs";
import defaultMdxComponents from "fumadocs-ui/mdx";
import type { MDXComponents } from "mdx/types";
@@ -9,6 +10,8 @@ export function getMDXComponents(components?: MDXComponents): MDXComponents {
...defaultMdxComponents,
ImageZoom,
Callout,
Tab,
Tabs,
APIPage,
...components,
p: ({ children }) => (

View File

@@ -5,6 +5,14 @@ const withMDX = createMDX();
/** @type {import('next').NextConfig} */
const config = {
reactStrictMode: true,
images: {
remotePatterns: [
{
protocol: "https",
hostname: "templates.dokploy.com",
},
],
},
};
export default withMDX(config);

View File

@@ -9,7 +9,8 @@
"types:check": "fumadocs-mdx && tsc --noEmit",
"postinstall": "fumadocs-mdx",
"fix-openapi": "node scripts/fix-openapi.mjs",
"build:docs": "npm run fix-openapi && node generate-docs.mjs"
"generate-templates": "node scripts/generate-templates.mjs",
"build:docs": "npm run fix-openapi && npm run generate-templates && node generate-docs.mjs"
},
"dependencies": {
"@next/third-parties": "16.0.7",
@@ -21,7 +22,7 @@
"fumadocs-openapi": "10.1.1",
"fumadocs-ui": "16.2.3",
"lucide-react": "^0.552.0",
"next": "16.0.10",
"next": "16.1.5",
"react": "^19.2.0",
"react-dom": "^19.2.0",
"shiki": "3.19.0",

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,193 @@
import fs from 'node:fs';
import path from 'node:path';
const TEMPLATES_URL = 'https://templates.dokploy.com/meta.json';
const BASE_BLUEPRINT_URL = 'https://templates.dokploy.com/blueprints';
const OUTPUT_DIR = './content/docs/templates';
async function fetchWithTimeout(url, options = {}, timeout = 10000) {
const controller = new AbortController();
const id = setTimeout(() => controller.abort(), timeout);
try {
const response = await fetch(url, {
...options,
signal: controller.signal
});
clearTimeout(id);
return response;
} catch (e) {
clearTimeout(id);
throw e;
}
}
async function getTemplateFile(id, fileName) {
try {
const response = await fetchWithTimeout(`${BASE_BLUEPRINT_URL}/${id}/${fileName}`);
if (!response.ok) return null;
return await response.text();
} catch (error) {
console.error(`Error fetching ${fileName} for ${id}:`, error.message);
return null;
}
}
/** Normalize and indent code so it renders correctly inside MDX code blocks (preserves YAML/TOML formatting). */
function formatCodeForMdx(code) {
if (!code || !code.trim()) return '# Not available';
return code
.replace(/\r\n/g, '\n')
.trim()
.split('\n')
.map((line) => line.trimEnd())
.join('\n')
.split('\n')
.map(line => ` ${line}`)
.join('\n');
}
/** Build Base64 payload for Dokploy import (same format as UI: compose + config as JSON, then base64). */
function templateToBase64(dockerCompose, config) {
const configObj = {
compose: dockerCompose || '',
config: config || '',
};
const jsonString = JSON.stringify(configObj, null, 2);
return Buffer.from(jsonString, 'utf-8').toString('base64');
}
async function generateTemplates() {
try {
console.log('Fetching templates metadata...');
const response = await fetch(TEMPLATES_URL);
const templates = await response.json();
console.log(`Found ${templates.length} templates. Starting data collection...`);
if (!fs.existsSync(OUTPUT_DIR)) {
fs.mkdirSync(OUTPUT_DIR, { recursive: true });
}
const batchSize = 10;
for (let i = 0; i < templates.length; i += batchSize) {
const batch = templates.slice(i, i + batchSize);
console.log(`Processing batch ${i / batchSize + 1}/${Math.ceil(templates.length / batchSize)}...`);
await Promise.all(batch.map(async (template) => {
const composeYaml = await getTemplateFile(template.id, 'docker-compose.yml');
const templateToml = await getTemplateFile(template.id, 'template.toml');
const instructionsRaw = await getTemplateFile(template.id, 'instructions.md');
const hasRealInstructions =
instructionsRaw &&
instructionsRaw.trim().length > 0 &&
!/^\s*<!doctype/i.test(instructionsRaw.trim()) &&
!/^\s*<html\b/i.test(instructionsRaw.trim());
const instructionsSafe = hasRealInstructions
? instructionsRaw.trim().replace(/\$\{/g, '\\${')
: '';
const safeDescription = template.description.replace(/"/g, '\\"');
const safeName = template.name.replace(/"/g, '\\"');
const logoUrl = `${BASE_BLUEPRINT_URL}/${template.id}/${template.logo}`;
const mdxContent = `---
title: "${safeName}"
description: "${safeDescription}"
---
<ImageZoom
src="${logoUrl}"
alt="${template.name} logo"
width={100}
height={100}
className="my-8 rounded-xl"
/>
## Configuration
<Tabs items={["docker-compose.yml", "template.toml"]}>
<Tab value="docker-compose.yml">
\`\`\`yaml
${formatCodeForMdx(composeYaml)}
\`\`\`
</Tab>
<Tab value="template.toml">
\`\`\`toml
${formatCodeForMdx(templateToml)}
\`\`\`
</Tab>
</Tabs>
## Base64
To import this template in Dokploy: create a **Compose** service → **Advanced** → **Base64 import** and paste the content below:
\`\`\`text
${templateToBase64(composeYaml, templateToml)}
\`\`\`
${instructionsSafe ? `
## Instructions
${instructionsSafe}
` : ''}
## Links
${template.links.website ? `- [Website](${template.links.website})` : ''}
${template.links.github ? `- [Github](${template.links.github})` : ''}
${template.links.docs ? `- [Documentation](${template.links.docs})` : ''}
## Tags
${template.tags.map(tag => `\`${tag}\``).join(', ')}
---
Version: \`${template.version}\`
`;
fs.writeFileSync(path.join(OUTPUT_DIR, `${template.id}.mdx`), mdxContent);
}));
}
// Generate index.mdx
const indexContent = `---
title: Introduction
description: Browse our collection of ${templates.length}+ self-hosted open source templates
---
# Templates
Welcome to the Dokploy Templates collection. We currently have **${templates.length}+** pre-configured templates that you can deploy with a single click.
Our templates cover a wide range of categories, including:
- **Databases**: PostgreSQL, MySQL, MongoDB, Redis, and more.
- **CMS**: WordPress, Ghost, Straple, Directus.
- **Analytics**: Umami, Plausible, Ackee.
- **Development Tools**: Gitea, Jenkins, Woodpecker CI.
- **And much more!**
Explore the sidebar to find the template you need.
`;
fs.writeFileSync(path.join(OUTPUT_DIR, 'index.mdx'), indexContent);
// Update meta.json with all template IDs
const metaContent = {
title: "Templates",
description: `Browse our collection of ${templates.length}+ self-hosted open source templates`,
icon: "LayoutGrid",
root: true,
pages: [
"index",
"---Templates---",
...templates.map(t => t.id)
]
};
fs.writeFileSync(path.join(OUTPUT_DIR, 'meta.json'), JSON.stringify(metaContent, null, 2));
console.log('✓ Successfully generated template documentation');
} catch (error) {
console.error('Error generating templates:', error);
process.exit(1);
}
}
generateTemplates();

View File

@@ -30,7 +30,7 @@ export default function Home() {
<Pricing />
</div>
<Faqs />
<Sponsors />
{/* <Sponsors /> */}
<CallToAction />
</main>
</div>

View File

@@ -16,6 +16,18 @@ export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
changeFrequency: "monthly",
priority: 0.8,
},
{
url: "https://dokploy.com/terms-of-service",
lastModified: new Date(),
changeFrequency: "yearly",
priority: 0.5,
},
{
url: "https://dokploy.com/privacy",
lastModified: new Date(),
changeFrequency: "yearly",
priority: 0.5,
},
...posts.map((post) => ({
url: `https://dokploy.com/blog/${post.slug}`,
lastModified: new Date(post.published_at),

View File

@@ -0,0 +1,957 @@
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Terms of Service",
description:
"Terms of Service for Dokploy's cloud and on-premise deployment platform.",
};
export default function TermsOfServicePage() {
return (
<div className="mx-auto flex w-full max-w-4xl flex-col gap-4 px-4 py-12">
<h1 className="mb-6 text-center text-3xl font-bold">
Terms of Service
</h1>
<p className="text-center text-sm text-muted-foreground">
Dokploy.com · Last Updated: January 2026
</p>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">Overview</h2>
<p>
This website and platform are operated by Dokploy Technologies, Inc.
(&quot;Dokploy&quot;, &quot;we&quot;, &quot;us&quot;, or
&quot;our&quot;). Dokploy provides a deployment and hosting platform
available as both a cloud-hosted service (&quot;Cloud Services&quot;)
and self-hosted software (&quot;On-Premise Software&quot;),
collectively referred to as the &quot;Services.&quot;
</p>
<p>
By accessing or using our Services, you (&quot;Customer&quot;,
&quot;you&quot;, or &quot;your&quot;) agree to be bound by these Terms
of Service (&quot;Terms&quot;), including our Privacy Policy and
Acceptable Use Policy incorporated herein by reference. If you are
entering into these Terms on behalf of an organization, you represent
that you have authority to bind that organization.
</p>
<p>
If you do not agree to these Terms, you may not access or use the
Services.
</p>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">
Section 1 Definitions
</h2>
<ul className="list-inside list-disc space-y-1">
<li>
<strong>&quot;Authorized Users&quot;</strong> means individuals
authorized by Customer to access and use the Services under
Customer&apos;s account.
</li>
<li>
<strong>&quot;Cloud Services&quot;</strong> means the hosted version
of the Dokploy platform provided and maintained by us, accessible
via the internet.
</li>
<li>
<strong>&quot;Customer Data&quot;</strong> means all data, content,
code, applications, and materials uploaded, stored, or processed by
Customer or its Authorized Users, or on behalf of Customer or its
Authorized users, through the Services.
</li>
<li>
<strong>&quot;Documentation&quot;</strong> means the user guides,
technical documentation, and other materials we provide describing
the functionality and use of the Services.
</li>
<li>
<strong>&quot;Downtime&quot;</strong> means periods when the Cloud
Services are unavailable, excluding Scheduled Maintenance and
exclusions defined in the SLA.
</li>
<li>
<strong>&quot;On-Premise Software&quot;</strong> means the
self-hosted version of the Dokploy platform that Customer installs
and operates on its own infrastructure.
</li>
<li>
<strong>&quot;Scheduled Maintenance&quot;</strong> means planned
maintenance windows communicated at least [48/72] hours in advance.
</li>
<li>
<strong>&quot;Services&quot;</strong> means the Cloud Services
and/or On-Premise Software, as applicable to Customer&apos;s
subscription.
</li>
<li>
<strong>&quot;Subscription Term&quot;</strong> means the period
during which Customer has paid for and is entitled to use the
Services.
</li>
</ul>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">
Section 2 Services Description
</h2>
<h3 className="text-xl font-medium">2.1 Cloud Services</h3>
<p>
The Cloud Services provide a managed deployment and hosting platform
accessible via the internet. We are responsible for infrastructure
maintenance, security updates, and platform availability in accordance
with our Service Level Agreement (Section 7). The services provided
are permitted to be used by businesses and individuals over the age
of 18 years.
</p>
<h3 className="text-xl font-medium">2.2 On-Premise Software</h3>
<p>
The On-Premise Software is licensed for installation on
Customer&apos;s own infrastructure. Customer is solely responsible for
the installation, configuration, maintenance, security, backups, and
availability of the On-Premise Software and the infrastructure on
which it operates. The Service Level Agreement (Section 7) does not
apply to On-Premise Software. The services provided are permitted to
be used by businesses and individuals over the age of 18 years.
</p>
<h3 className="text-xl font-medium">2.3 Modifications to Services</h3>
<p>
We reserve the right to modify, update, or discontinue features of the
Services at any time. For material changes that negatively affect
functionality, we will provide thirty [30] days&apos; notice in
writing prior to the implementation of the change. Such modifications
shall not materially reduce the core functionality of the Services
during an active Subscription Term.
</p>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">
Section 3 Account Registration and Responsibilities
</h2>
<h3 className="text-xl font-medium">3.1 Eligibility</h3>
<p>
You must be at least 18 years of age and capable of forming a binding
contract to use the Services. By using the Services, you represent
that you meet these requirements.
</p>
<h3 className="text-xl font-medium">3.2 Account Security</h3>
<p>
You are responsible for maintaining the confidentiality of your
account credentials and for all activities that occur under your
account. You must immediately notify us of any unauthorized use of your
account or any other breach of security. We are not liable for any
loss arising from unauthorized use of your account.
</p>
<h3 className="text-xl font-medium">3.3 Account Information</h3>
<p>
You agree to provide accurate, current, and complete information
during registration and to update such information to keep it
accurate, current, and complete. We reserve the right to suspend or
terminate accounts with inaccurate or incomplete information.
</p>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">Section 4 License Grant</h2>
<h3 className="text-xl font-medium">4.1 Cloud Services License</h3>
<p>
Subject to these Terms and payment of applicable fees, we grant you a
limited, non-exclusive, non-transferable, non-sublicensable right to
access and use the Cloud Services during the Subscription Term for
your internal business purposes.
</p>
<h3 className="text-xl font-medium">4.2 On-Premise Software License</h3>
<p>
Subject to these Terms and payment of applicable fees, we grant you a
limited, non-exclusive, non-transferable, non-sublicensable license to
install and use the On-Premise Software on your own infrastructure
during the Subscription Term. This license is limited to the number
of instances, nodes, or users specified in your subscription plan.
The On-Premise Software may be used solely for Customer&apos;s internal
business purposes and may not be used to provide services to third
parties, operate as a managed service, or otherwise make the
On-Premise Software available to any third party without our prior
written consent.
</p>
<h3 className="text-xl font-medium">4.3 Documentation License</h3>
<p>
We grant you a limited, non-exclusive license to use the
Documentation solely in connection with your authorized use of the
Services.
</p>
<h3 className="text-xl font-medium">4.4 Restrictions</h3>
<p>
You shall not: (a) sublicense, sell, resell, transfer, assign, or
distribute the Services; (b) modify or make derivative works based
upon the Services; (c) reverse engineer, disassemble, or decompile the
Services or attempt to discover the source code; (d) access the
Services to build a competitive product or service; (e) copy any
features, functions, or graphics of the Services; or (f) use the
Services in violation of applicable laws.
</p>
<h3 className="text-xl font-medium">4.5 Usage Verification</h3>
<p>
We may, upon reasonable prior notice and not more than once annually,
audit Customer&apos;s use of the On-Premise Software solely to verify
compliance with the license scope and usage limits. Any such audit
shall be conducted in a manner that does not unreasonably interfere
with Customer&apos;s operations.
</p>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">
Section 5 Acceptable Use Policy
</h2>
<h3 className="text-xl font-medium">5.1 General Prohibitions</h3>
<p>
You agree not to use the Services to: (a) violate any applicable law,
regulation, or third-party rights; (b) upload, transmit, or store any
content that is unlawful, harmful, threatening, abusive, defamatory,
obscene, or otherwise objectionable; (c) infringe any intellectual
property rights; (d) transmit viruses, malware, or other malicious
code; (e) interfere with or disrupt the integrity or performance of
the Services; (f) attempt to gain unauthorized access to the Services
or related systems; (g) harass, abuse, or harm another person or
entity; (h) collect personal information without proper consent; (i)
access any computer systems without authorization or attempt to
penetrate or disable any security system; or (j) issue fraudulent
offers to sell or buy products, services, or investments or otherwise
engage in fraud.
</p>
<p>
If you discover a violation of the AUP, you must report it within 24
(twenty-four) hours of the discovery to &lt;insert contact email&gt;
with as much information as you have including, but not limited to,
the date and time of the violation and any identifying information
regarding the violator including e-mail or IP address, if available.
</p>
<h3 className="text-xl font-medium">5.2 Hosting-Specific Prohibitions</h3>
<p>The following activities are strictly prohibited on our platform:</p>
<ul className="list-inside list-disc space-y-1">
<li>
(a) Cryptocurrency mining or any resource-intensive computational
activities not directly related to your hosted applications;
</li>
<li>
(b) Hosting, distributing, or linking to malware, phishing sites,
botnets, or any malicious software;
</li>
<li>
(c) Hosting content that exploits minors in any way, including
child sexual abuse material (CSAM);
</li>
<li>
(d) Operating open proxies, anonymizers, or services designed to
obscure network traffic origins;
</li>
<li>(e) Launching or facilitating denial-of-service (DoS/DDoS) attacks;</li>
<li>
(f) Sending spam, unsolicited bulk messages, or phishing
communications;
</li>
<li>
(g) Circumventing or attempting to circumvent resource limits,
quotas, or usage restrictions;
</li>
<li>
(h) Hosting content or applications that violate export control
laws or sanctions.
</li>
</ul>
<h3 className="text-xl font-medium">5.3 Resource Usage</h3>
<p>
Your use of computational resources must be consistent with your
subscription plan. We reserve the right to throttle, suspend, or
terminate access if your usage materially exceeds normal patterns or
negatively impacts other customers.
</p>
<h3 className="text-xl font-medium">5.4 Enforcement</h3>
<p>
Violation of this Acceptable Use policy (hereinafter &quot;AUP&quot;)
may lead to suspension or termination of your account and legal
action. We reserve the right to take any other remedial action
including reporting illegal activities to appropriate law enforcement
authorities. You may be required to pay for the costs of
investigation and remedial action related to AUP violations.
</p>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">
Section 6 Fees and Payment
</h2>
<h3 className="text-xl font-medium">6.1 Subscription Fees</h3>
<p>
You agree to pay all fees specified in your subscription plan or Order
Form. Fees are charged in advance on a monthly or annual basis as
stated in the subscription plan or Order Form and are non-refundable
except as expressly provided in these Terms.
</p>
<h3 className="text-xl font-medium">6.2 Payment Terms</h3>
<p>
Payment is due upon invoice or at the start of each billing period.
You authorize us to charge your designated payment method for all
applicable fees. If payment fails, we may suspend access to the
Services until payment is received.
</p>
<h3 className="text-xl font-medium">6.3 Taxes</h3>
<p>
All fees are exclusive of taxes. You are responsible for paying all
applicable taxes, except for taxes based on our net income. If we are
required to collect or pay taxes, those taxes will be invoiced to you.
</p>
<h3 className="text-xl font-medium">6.4 Price Changes</h3>
<p>
We may change our pricing at any time. Price changes will take effect
at the start of your next Subscription Term following thirty [30]
days&apos; notice. Continued use after price changes constitutes
acceptance of the new pricing.
</p>
<h3 className="text-xl font-medium">6.5 Refunds</h3>
<p>
All fees paid pursuant to these Terms of Service are non-refundable
except as expressly stated in these Terms or required by applicable
law. Service Credits under Section 7.3 of these Terms are
Customer&apos;s sole and exclusive remedy for any failure to meet
uptime commitments and are not cash refunds.
</p>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">
Section 7 Service Level Agreement (Cloud Services Only)
</h2>
<p>
This Section 7 applies only to Cloud Services. On-Premise Software
customers are solely responsible for availability and performance of
their self-hosted installations.
</p>
<h3 className="text-xl font-medium">7.1 Uptime Commitment</h3>
<p>
We commit to [99.9%] monthly uptime for the Cloud Services, measured
as: ((Total Minutes in Month - Downtime Minutes) / Total Minutes in
Month) × 100.
</p>
<h3 className="text-xl font-medium">7.2 Exclusions</h3>
<p>
The following are excluded from Downtime calculations: (a) Scheduled
Maintenance; (b) outages caused by factors outside our reasonable
control, including force majeure events, internet service provider
failures, or third-party service outages; (c) outages resulting from
Customer actions or inactions, including misconfiguration; (d)
outages during beta or preview features.
</p>
<h3 className="text-xl font-medium">7.3 Service Credits</h3>
<p>
If we fail to meet our uptime commitment, you may request service
credits as follows:
</p>
<ul className="list-inside list-disc space-y-1">
<li>99.0% - 99.9% uptime: [10%] credit of monthly fees</li>
<li>95.0% - 99.0% uptime: [25%] credit of monthly fees</li>
<li>Below 95.0% uptime: [50%] credit of monthly fees</li>
</ul>
<p>
Credits must be requested within 30 (thirty) days of the incident.
Credits are applied to future invoices and do not exceed one
month&apos;s fees. Credits are your sole and exclusive remedy for
service level failures.
</p>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">
Section 8 Support and Maintenance
</h2>
<h3 className="text-xl font-medium">8.1 Cloud Services Support</h3>
<p>
We provide technical support for Cloud Services via{" "}
<a
href="mailto:support@dokploy.com"
className="text-primary underline hover:no-underline"
>
support@dokploy.com
</a>{" "}
or chat during Monday-Friday, 9am-6pm EST. Response times vary by plan
tier as specified in your subscription agreement.
</p>
<h3 className="text-xl font-medium">8.2 On-Premise Software Support</h3>
<p>
Support for On-Premise Software is limited to software defects and
installation guidance. We do not provide support for Customer&apos;s
infrastructure, third-party integrations, or issues arising from
Customer modifications to the software unless otherwise agreed upon
with Dokploy.
</p>
<h3 className="text-xl font-medium">8.3 Updates and Upgrades</h3>
<p>
For Cloud Services, we apply updates and patches automatically. For
On-Premise Software, we make updates available for download, and
Customer is responsible for applying them. Major version upgrades may
require additional fees as specified in your subscription.
</p>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">Section 9 Customer Data</h2>
<h3 className="text-xl font-medium">9.1 Ownership</h3>
<p>
You retain all rights, title, and interest in and to your Customer
Data. Our use and possession thereof is solely on Customer&apos;s
behalf and we claim no ownership over Customer Data.
</p>
<h3 className="text-xl font-medium">9.2 License to Customer Data</h3>
<p>
You grant us a limited, non-exclusive license to access, use, and
process Customer Data solely as necessary to provide the Services,
comply with the law, and enforce these Terms during the term defined
in the Subscription plan. We may process Customer Data and usage
solely to operate, maintain, support, and improve the Services,
including for internal usage analytics, performance monitoring, and
troubleshooting. Any such processing will be performed in accordance
with the DPA incorporated herein.
</p>
<h3 className="text-xl font-medium">9.3 Data Security (Cloud Services)</h3>
<p>
We implement industry-standard security measures to protect Customer
Data in our Cloud Services, including encryption in transit and at
rest, access controls, and regular security assessments. Our security
practices are described in our Security Documentation available at{" "}
<a
href="https://docs.dokploy.com/docs/core/remote-servers/security"
target="_blank"
rel="noopener noreferrer"
className="text-primary underline hover:no-underline"
>
docs.dokploy.com/docs/core/remote-servers/security
</a>
.
</p>
<h3 className="text-xl font-medium">9.4 Data Security (On-Premise Software)</h3>
<p>
For On-Premise Software, Customer is solely responsible for
implementing appropriate security measures, including encryption,
access controls, network security, and compliance with applicable data
protection regulations.
</p>
<h3 className="text-xl font-medium">9.5 Backups</h3>
<p>
For Cloud Services, we perform daily backups and retain them for one
hundred (100) days. For On-Premise Software, Customer is solely
responsible for implementing backup procedures.
</p>
<h3 className="text-xl font-medium">9.6 Data Portability</h3>
<p>
Upon termination, you may export your Customer Data for thirty (30)
days following termination. After this period, we may delete your
Customer Data. We are not obligated to retain Customer Data after the
export period.
</p>
<h3 className="text-xl font-medium">9.7 Data Processing</h3>
<p>
Our processing of personal data is governed by our Privacy Policy and,
where applicable, the Data Processing Agreement (hereinafter
&quot;DPA&quot;) attached hereto as Appendix I and is incorporated by
reference. The DPA applies only to the extent that the Services
involve the processing of Personal Data on behalf of the customer. In
the event of a conflict between these terms and the DPA, the DPA
shall prevail solely with respect to the Processing of Personal Data.
</p>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">
Section 10 Intellectual Property
</h2>
<h3 className="text-xl font-medium">10.1 Our Intellectual Property</h3>
<p>
The Services, including all software, designs, text, graphics, and
other content (excluding Customer Data), are owned by us or our
licensors and are protected by intellectual property laws. These Terms
do not grant you any rights to our trademarks, service marks, or
logos.
</p>
<h3 className="text-xl font-medium">10.2 Feedback</h3>
<p>
If you provide suggestions, ideas, or feedback about the Services
(&quot;Feedback&quot;), you grant us a perpetual, irrevocable,
royalty-free, worldwide license to use, modify, and incorporate such
Feedback into the Services without obligation to you.
</p>
<h3 className="text-xl font-medium">10.3 Customer Applications</h3>
<p>
You retain all intellectual property rights in applications, code, and
content you develop or deploy using the Services.
</p>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">
Section 11 Confidentiality
</h2>
<h3 className="text-xl font-medium">11.1 Definition</h3>
<p>
&quot;Confidential Information&quot; means any non-public information
disclosed by one party to the other that is designated as
confidential or that a reasonable person would understand to be
confidential, including pricing, business plans, technical data, and
Customer Data.
</p>
<h3 className="text-xl font-medium">11.2 Obligations</h3>
<p>
Each party agrees to: (a) protect the other party&apos;s Confidential
Information using at least the same degree of care it uses to protect
its own confidential information of similar nature but with no less
than reasonable care; (b) use Confidential Information only for
purposes directly related to performing under these Terms and as
described in the Subscription Plan or Order Form; and (c) not disclose
Confidential Information to any third party except as permitted under
these Terms or with the prior written consent of the disclosing party
and in accordance with the disclosing party&apos;s privacy policy.
</p>
<p>
Disclosure required by law: Recipient may disclose Confidential
Information to the extent required by applicable law or a valid Court
Order provided that the recipient: (a) notifies the disclosing party
immediately upon receiving notice of such a law or Order so that the
disclosing party may seek a protective order or other remedies; and
(b) reasonably cooperates with any efforts by the disclosing party to
limit or protect the disclosure.
</p>
<p>
Recipient shall promptly notify the disclosing party upon becoming
aware of any authorized access, use, or disclosure of Confidential
Information.
</p>
<h3 className="text-xl font-medium">11.3 Exceptions</h3>
<p>
Confidentiality obligations do not apply to information that: (a) is
or becomes publicly available without breach; (b) was known prior to
disclosure; (c) is received from a third party without
confidentiality restrictions; or (d) is independently developed
without use of Confidential Information.
</p>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">
Section 12 Third-Party Services
</h2>
<p>
The Services may integrate with or rely upon third-party services,
including container registries, cloud providers, and external APIs.
Your use of third-party services is subject to their respective
terms and conditions. We are not responsible for the availability,
accuracy, or content of third-party services, and we make no
warranties regarding them.
</p>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">
Section 13 Term and Termination
</h2>
<h3 className="text-xl font-medium">13.1 Term</h3>
<p>
These Terms commence upon your first use of the Services and continue
until terminated. Subscription Terms automatically renew for
successive periods of the same duration unless either party provides
written notice of non-renewal at least thirty [30] days before the
end of the current term.
</p>
<h3 className="text-xl font-medium">13.2 Termination for Convenience</h3>
<p>
You may terminate your subscription at any time and without cause by
providing thirty (30) days written notice. If you terminate for
convenience under this Section, you will remain liable for the full
balance of fees due for the remainder of the Term of the Agreement.
No refunds are provided for unused portions of prepaid fees except as
expressly stated in Section 6.5.
</p>
<h3 className="text-xl font-medium">13.3 Termination for Cause</h3>
<p>
Either party may terminate this Agreement for the other&apos;s
material breach by written notice specifying, in detail, the nature
of the breach. The breaching party will have thirty (30) days from the
date the party receives notice of the breach to cure the breach. If
the breaching party fails to cure the breach within thirty (30) days,
the other party may terminate at the expiration of the cure period.
</p>
<p>
Either party may terminate this Agreement without advance notice in
the event that the other party becomes insolvent, files for
bankruptcy, or ceases business operations.
</p>
<h3 className="text-xl font-medium">13.4 Suspension</h3>
<p>
We may suspend your access to the Services immediately without notice
if: (a) you violate the Acceptable Use Policy; (b) your use poses a
security risk to the Services or other customers; (c) you fail to pay
fees when due; or (d) we are required to do so by law.
</p>
<h3 className="text-xl font-medium">13.5 Effect of Termination</h3>
<p>
Upon termination: (a) your license to use the Services immediately
terminates; (b) you must cease all use of the Services and uninstall
any On-Premise Software and delete all copies in its possession or
control; (c) you may export Customer Data for thirty [30] days as
provided in Section 9.6; (d) each party must return or destroy the
other party&apos;s Confidential Information. Sections that by their
nature should survive termination shall survive, including Sections
9, 10, 11, 14, 15, and 16.
</p>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">
Section 14 Warranties and Disclaimers
</h2>
<h3 className="text-xl font-medium">14.1 Our Warranties</h3>
<p>
We warrant that: (a) we have the authority to enter into these Terms;
(b) the Services will perform materially in accordance with the
Documentation; and (c) we will not knowingly introduce viruses or
malicious code into the Services.
</p>
<h3 className="text-xl font-medium">14.2 Disclaimer</h3>
<p className="uppercase">
Except as expressly provided in Section 14.1, the Services are
provided &quot;AS IS&quot; and &quot;AS AVAILABLE&quot; with no
representation or warranty of any kind. We disclaim all warranties,
express or implied, including warranties of merchantability, fitness
for a particular purpose, non-infringement of intellectual property
rights, and any warranties arising from course of dealing or usage of
trade. We do not warrant that the Services will be uninterrupted,
error-free, or completely secure. Without limiting the generality of
the foregoing, we have no obligation to indemnify, defend, or hold
harmless Customer, including without limitation against claims related
to product liability or infringement of intellectual property
rights, unless this Agreement specifically provides for such an
indemnity.
</p>
<h3 className="text-xl font-medium">14.3 Beta Features</h3>
<p>
Beta, preview, or experimental features are provided &quot;as
is&quot; without any warranty. We may modify or discontinue beta
features at any time without notice.
</p>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">
Section 15 Limitation of Liability
</h2>
<h3 className="text-xl font-medium">15.1 Exclusion of Damages</h3>
<p className="uppercase">
To the maximum extent permitted by law, neither party shall be liable
for any indirect, incidental, special, consequential, or punitive
damages, including lost profits, lost revenue, lost data, or business
interruption, regardless of the theory of liability and even if
advised of the possibility of such damages.
</p>
<h3 className="text-xl font-medium">15.2 Liability Cap</h3>
<p className="uppercase">
Our total cumulative liability under these Terms shall not exceed the
greater of: (A) the amounts paid by you to us in the twelve [12]
months preceding the claim; or (B) the value of the Agreement for the
preceding twelve (12) months. This limitation applies regardless of
the form of action, whether in contract, tort, strict liability, or
otherwise.
</p>
<h3 className="text-xl font-medium">15.3 Exceptions</h3>
<p>
The limitations in this Section 15 do not apply to: (a) your payment
obligations; (b) either party&apos;s indemnification obligations; (c)
breaches of confidentiality; (d) your violation of our intellectual
property rights; or (e) claims arising from gross negligence or
willful misconduct.
</p>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">
Section 16 Indemnification
</h2>
<h3 className="text-xl font-medium">16.1 Your Indemnification</h3>
<p>
You agree to indemnify, defend, and hold harmless, at your own cost,
Dokploy and its officers, directors, employees, and agents from any
claims, damages, losses, and expenses (including reasonable
attorneys&apos; fees) arising from: (a) your use of the Services; (b)
your Customer Data; (c) your violation of these Terms; (d) your
violation of any third-party rights; or (e) applications or content
you deploy using the Services.
</p>
<h3 className="text-xl font-medium">16.2 Our Indemnification</h3>
<p>
We will indemnify and defend you, at our own cost, from third-party
claims alleging that your authorized use of the Services infringes a
third party&apos;s intellectual property rights, provided you: (a)
promptly notify us of the claim; (b) give us sole control of the
defense and settlement; and (c) provide reasonable cooperation.
</p>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">
Section 17 Governing Law and Dispute Resolution
</h2>
<h3 className="text-xl font-medium">17.1 Governing Law</h3>
<p>
These Terms shall be governed by and construed in accordance with
the laws of the State of Delaware, United States, without regard to
its conflict of law principles.
</p>
<h3 className="text-xl font-medium">17.2 Dispute Resolution</h3>
<p>
[OPTION 1 - ARBITRATION: Any dispute arising from these Terms shall
be resolved by binding arbitration administered by AAA in accordance
with its Commercial Arbitration Rules. The arbitration shall be
conducted in the State of Delaware. The arbitrator&apos;s decision
shall be final and binding.]
</p>
<h3 className="text-xl font-medium">17.3 Waiver of Jury Trial</h3>
<p className="uppercase">
Each party waives its right to a jury trial for any dispute arising
from these Terms.
</p>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">
Section 19 Changes to Terms
</h2>
<p>
We may update these Terms from time to time. For material changes, we
will provide at least thirty [30] days&apos; notice via email or
through the Services. Your continued use of the Services after the
effective date of changes constitutes acceptance of the updated Terms.
If you do not agree to the changes, you may terminate your subscription
before the changes take effect.
</p>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">
Section 20 General Provisions
</h2>
<h3 className="text-xl font-medium">20.1 Entire Agreement</h3>
<p>
This Agreement is the parties&apos; entire agreement regarding its
subject matter and supersedes any prior or contemporaneous agreements
regarding its subject matter. In this Agreement, headings are for
convenience only and &quot;including&quot; and similar terms are to
be construed without limitation. Excluding Orders, terms in business
forms, purchase orders or quotes used by either party will not amend
or modify this Agreement; any such documents are for administrative
purposes only. This Agreement may be executed in counterparts
(including electronic copies and PDFs), each of which is deemed an
original and which together form one and the same Agreement.
</p>
<h3 className="text-xl font-medium">20.2 Waivers and Severability</h3>
<p>
Waivers must be signed by the waiving party&apos;s authorized
representative and cannot be implied from conduct. If any provision of
this Agreement is held invalid, illegal or unenforceable, it will be
limited to the minimum extent necessary so the rest of this Agreement
remains in effect.
</p>
<h3 className="text-xl font-medium">20.4 Assignment</h3>
<p>
Neither party may assign this Agreement without the prior consent of
the other party, except that either party may assign this Agreement,
with notice to the other party, in connection with the assigning
party&apos;s merger, reorganization, acquisition or other transfer
of all or substantially all of its assets or voting securities. Any
non-permitted assignment is void. This Agreement will bind and inure
to the benefit of each party&apos;s permitted successors and assigns.
</p>
<h3 className="text-xl font-medium">20.5 Notices</h3>
<p>
A. Except as set out in this Agreement, notices, requests and approvals
under this Agreement must be in writing to the addresses on the Cover
Page and will be deemed given: (1) upon receipt if by personal
delivery, (2) upon receipt if by certified or registered U.S. mail
(return receipt requested), (3) one day after dispatch if by a
commercial overnight delivery or (4) upon delivery if by email.
Either party may update its address with notice to the other.
</p>
<p>B. Provider may also send operational notices through the Cloud Service.</p>
<h3 className="text-xl font-medium">20.6 Force Majeure</h3>
<p>
Neither party is liable for a delay or failure to perform this
Agreement due to a Force Majeure. If a Force Majeure materially
adversely affects the Cloud Service for 15 or more consecutive days,
either party may terminate the affected Order(s) upon notice to the
other and Provider will refund to Customer any pre-paid, unused fees
for the terminated portion of the Subscription Term. However, this
Section does not limit Customer&apos;s obligations to pay fees owed.
</p>
<h3 className="text-xl font-medium">20.7 Independent Contractors</h3>
<p>
The parties are independent contractors. Nothing in these Terms
creates a partnership, joint venture, agency, or employment
relationship.
</p>
</section>
<section className="flex flex-col gap-2">
<h2 className="mb-2 text-2xl font-semibold">
Section 21 Contact Information
</h2>
<p>
If you have questions about these Terms of Service, please contact us
at:
</p>
<p className="font-medium">Dokploy Technologies, Inc.</p>
<p>2912 Steiner St Unit 4
San Francisco, CA 94123</p>
<p>
Email:{" "}
<a
href="mailto:contact@dokploy.com"
className="text-primary underline hover:no-underline"
>
contact@dokploy.com
</a>
</p>
</section>
<section className="flex flex-col gap-2 border-t pt-8">
<h2 className="mb-4 text-2xl font-semibold">
Appendix I - Data Processing Addendum
</h2>
<p>
This Data Protection Addendum (&quot;DPA&quot;) is attached to and
incorporated into the Terms of Service. Customer and Provider enter
into this DPA by agreeing to the Terms of Service. Capitalized terms
not defined in this DPA are defined in the Terms of Service or DPA
Setup Page.
</p>
<h3 className="text-xl font-medium">Definitions</h3>
<ul className="list-inside list-disc space-y-1">
<li>
&quot;Agreement&quot; means the Agreement between Customer and
Provider incorporating the Bonterms Cloud Terms which is specified
on the DPA Setup Page.
</li>
<li>
&quot;Audit&quot; and &quot;Audit Parameters&quot; are defined in
Section 9.3 below.
</li>
<li>&quot;Audit Report&quot; is defined in Section 9.2 below.</li>
<li>
&quot;Controller&quot; means the natural or legal person, public
authority, agency or other body which, alone or jointly with
others, determines the purposes and means of Processing of
Personal Data.
</li>
<li>&quot;Customer Instructions&quot; is defined in Section 3.1 below.</li>
<li>
&quot;Customer Personal Data&quot; means Personal Data in Customer
Data (as defined in the Agreement).
</li>
<li>
&quot;Data Protection Laws&quot; means all laws and regulations
applicable to the Processing of Customer Personal Data under the
Agreement, including, as applicable: (i) the California Consumer
Privacy Act, as amended by the California Privacy Rights Act, and
any binding regulations promulgated thereunder (&quot;CCPA&quot;),
(ii) the General Data Protection Regulation (Regulation (EU)
2016/679) (&quot;EU GDPR&quot; or &quot;GDPR&quot;), (iii) the
Swiss Federal Act on Data Protection (&quot;FADP&quot;), (iv) the EU
GDPR as it forms part of the law of England and Wales by virtue of
section 3 of the European Union (Withdrawal) Act 2018 (the &quot;UK
GDPR&quot;) and (v) the UK Data Protection Act 2018; in each case,
as updated, amended or replaced from time to time.
</li>
<li>
&quot;Data Subject&quot; means the identified or identifiable
natural person to whom Customer Personal Data relates.
</li>
<li>
&quot;DPA Effective Date&quot; is specified on the DPA Setup Page.
</li>
<li>
&quot;DPA Setup Page&quot; means a separate document executed by
Customer and Provider which causes this DPA to become an
Attachment to their Agreement.
</li>
<li>&quot;EEA&quot; means European Economic Area.</li>
<li>
&quot;Key Terms&quot; means Agreement, DPA Effective Date and
Subprocessor List as specified by the parties on the DPA Setup
Page.
</li>
<li>
&quot;Personal Data&quot; means information about an identified or
identifiable natural person or which otherwise constitutes
&quot;personal data&quot;, &quot;personal information&quot;,
&quot;personally identifiable information&quot; or similar terms
as defined in Data Protection Laws.
</li>
<li>
&quot;Processing&quot; and inflections thereof refer to any
operation or set of operations that is performed on Personal Data
or on sets of Personal Data, whether or not by automated means.
</li>
<li>
&quot;Processor&quot; means a natural or legal person, public
authority, agency or other body which Processes Personal Data on
behalf of the Controller.
</li>
<li>
&quot;Restricted Transfer&quot; means: (i) where EU GDPR applies, a
transfer of Customer Personal Data from the EEA to a country
outside the EEA that is not subject to an adequacy determination,
(ii) where UK GDPR applies, a transfer of Customer Personal Data
from the United Kingdom to any other country that is not subject to
an adequacy determination or (iii) where FADP applies, a transfer
of Customer Personal Data from Switzerland to any other country
that is not subject to an adequacy determination.
</li>
<li>
&quot;Schedules&quot; means one or more schedules incorporated by
the parties in their DPA Setup Page. The default Schedules for this
DPA are: Schedule 1 Subject Matter and Details of Processing;
Schedule 2 Technical and Organizational Measures; Schedule 3
Cross-Border Transfer Mechanisms; Schedule 4 Region-Specific Term.
</li>
<li>
&quot;Security Incident&quot; means any breach of security that
leads to the accidental or unlawful destruction, loss, alteration,
unauthorized disclosure of, or access to, Customer Personal Data
being Processed by Provider.
</li>
<li>&quot;Specified Notice Period&quot; is 48 hours.</li>
<li>
&quot;Subprocessor&quot; means any third party authorized by
Provider to Process any Customer Personal Data.
</li>
<li>
&quot;Subprocessor List&quot; means the list of Provider&apos;s
Subprocessors as identified or linked to on the DPA Setup Page.
</li>
</ul>
<p className="mt-4">
The full DPA continues with sections on Scope and Duration, Processing
of Personal Data, Confidentiality, Compliance with Laws, Subprocessors,
Security, Data Subject Requests, Data Return or Deletion, Audits, and
Cross-Border Transfers/Region-Specific Terms. For the complete
legal text of the Data Processing Addendum, please contact{" "}
<a
href="mailto:support@dokploy.com"
className="text-primary underline hover:no-underline"
>
support@dokploy.com
</a>
.
</p>
</section>
</div>
);
}

View File

@@ -47,6 +47,7 @@ export function Footer() {
>
Docs
</NavLink>
<NavLink href="/terms-of-service">Terms of Service</NavLink>
<NavLink href="/privacy">Privacy Policy</NavLink>
</div>
</nav>

View File

@@ -36,7 +36,7 @@
"clsx": "^2.1.0",
"framer-motion": "^11.3.19",
"lucide-react": "0.364.0",
"next": "16.0.10",
"next": "16.1.5",
"react": "^19.2.0",
"react-dom": "^19.2.0",
"react-ga4": "^2.1.0",

View File

@@ -261,7 +261,11 @@ install_dokploy() {
# Installation
# Set RELEASE_TAG environment variable for canary/feature versions
release_tag_env=""
if [ "$VERSION_TAG" != "latest" ]; then
if [[ "$VERSION_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+ ]]; then
# Specific version (v0.26.6, v0.26.7, etc.) → latest
release_tag_env="-e RELEASE_TAG=latest"
elif [ "$VERSION_TAG" != "latest" ]; then
# canary, feature/*, etc. → use the tag as-is
release_tag_env="-e RELEASE_TAG=$VERSION_TAG"
fi

141
pnpm-lock.yaml generated
View File

@@ -32,7 +32,7 @@ importers:
dependencies:
'@next/third-parties':
specifier: 16.0.7
version: 16.0.7(next@16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)
version: 16.0.7(next@16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)
'@radix-ui/react-dropdown-menu':
specifier: ^2.1.16
version: 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
@@ -44,22 +44,22 @@ importers:
version: 2.1.1
fumadocs-core:
specifier: 16.2.3
version: 16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13)
version: 16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13)
fumadocs-mdx:
specifier: 14.1.0
version: 14.1.0(fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)
version: 14.1.0(fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)
fumadocs-openapi:
specifier: 10.1.1
version: 10.1.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13))(fumadocs-ui@16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13))(prettier@3.3.3)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
version: 10.1.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13))(fumadocs-ui@16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13))(prettier@3.3.3)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
fumadocs-ui:
specifier: 16.2.3
version: 16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13)
version: 16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13)
lucide-react:
specifier: ^0.552.0
version: 0.552.0(react@19.2.1)
next:
specifier: 16.0.10
version: 16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
specifier: 16.1.5
version: 16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
react:
specifier: ^19.2.0
version: 19.2.1
@@ -111,7 +111,7 @@ importers:
version: 0.2.1(tailwindcss@3.4.7)
'@next/third-parties':
specifier: 16.0.7
version: 16.0.7(next@16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)
version: 16.0.7(next@16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)
'@prettier/plugin-xml':
specifier: ^3.4.1
version: 3.4.1(prettier@3.3.3)
@@ -176,8 +176,8 @@ importers:
specifier: 0.364.0
version: 0.364.0(react@19.2.1)
next:
specifier: 16.0.10
version: 16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
specifier: 16.1.5
version: 16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
prettier:
specifier: ^3.3.3
version: 3.3.3
@@ -1027,53 +1027,53 @@ packages:
'@mixmark-io/domino@2.2.0':
resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==}
'@next/env@16.0.10':
resolution: {integrity: sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==}
'@next/env@16.1.5':
resolution: {integrity: sha512-CRSCPJiSZoi4Pn69RYBDI9R7YK2g59vLexPQFXY0eyw+ILevIenCywzg+DqmlBik9zszEnw2HLFOUlLAcJbL7g==}
'@next/swc-darwin-arm64@16.0.10':
resolution: {integrity: sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==}
'@next/swc-darwin-arm64@16.1.5':
resolution: {integrity: sha512-eK7Wdm3Hjy/SCL7TevlH0C9chrpeOYWx2iR7guJDaz4zEQKWcS1IMVfMb9UKBFMg1XgzcPTYPIp1Vcpukkjg6Q==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
'@next/swc-darwin-x64@16.0.10':
resolution: {integrity: sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==}
'@next/swc-darwin-x64@16.1.5':
resolution: {integrity: sha512-foQscSHD1dCuxBmGkbIr6ScAUF6pRoDZP6czajyvmXPAOFNnQUJu2Os1SGELODjKp/ULa4fulnBWoHV3XdPLfA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
'@next/swc-linux-arm64-gnu@16.0.10':
resolution: {integrity: sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==}
'@next/swc-linux-arm64-gnu@16.1.5':
resolution: {integrity: sha512-qNIb42o3C02ccIeSeKjacF3HXotGsxh/FMk/rSRmCzOVMtoWH88odn2uZqF8RLsSUWHcAqTgYmPD3pZ03L9ZAA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@next/swc-linux-arm64-musl@16.0.10':
resolution: {integrity: sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==}
'@next/swc-linux-arm64-musl@16.1.5':
resolution: {integrity: sha512-U+kBxGUY1xMAzDTXmuVMfhaWUZQAwzRaHJ/I6ihtR5SbTVUEaDRiEU9YMjy1obBWpdOBuk1bcm+tsmifYSygfw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@next/swc-linux-x64-gnu@16.0.10':
resolution: {integrity: sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==}
'@next/swc-linux-x64-gnu@16.1.5':
resolution: {integrity: sha512-gq2UtoCpN7Ke/7tKaU7i/1L7eFLfhMbXjNghSv0MVGF1dmuoaPeEVDvkDuO/9LVa44h5gqpWeJ4mRRznjDv7LA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@next/swc-linux-x64-musl@16.0.10':
resolution: {integrity: sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==}
'@next/swc-linux-x64-musl@16.1.5':
resolution: {integrity: sha512-bQWSE729PbXT6mMklWLf8dotislPle2L70E9q6iwETYEOt092GDn0c+TTNj26AjmeceSsC4ndyGsK5nKqHYXjQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@next/swc-win32-arm64-msvc@16.0.10':
resolution: {integrity: sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==}
'@next/swc-win32-arm64-msvc@16.1.5':
resolution: {integrity: sha512-LZli0anutkIllMtTAWZlDqdfvjWX/ch8AFK5WgkNTvaqwlouiD1oHM+WW8RXMiL0+vAkAJyAGEzPPjO+hnrSNQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
'@next/swc-win32-x64-msvc@16.0.10':
resolution: {integrity: sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==}
'@next/swc-win32-x64-msvc@16.1.5':
resolution: {integrity: sha512-7is37HJTNQGhjPpQbkKjKEboHYQnCgpVt/4rBrrln0D9nderNxZ8ZWs8w1fAtzUx7wEyYjQ+/13myFgFj6K2Ng==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@@ -2309,6 +2309,10 @@ packages:
resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==}
engines: {node: '>= 0.4'}
baseline-browser-mapping@2.9.19:
resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==}
hasBin: true
binary-extensions@2.3.0:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
engines: {node: '>=8'}
@@ -3537,8 +3541,8 @@ packages:
react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
next@16.0.10:
resolution: {integrity: sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==}
next@16.1.5:
resolution: {integrity: sha512-f+wE+NSbiQgh3DSAlTaw2FwY5yGdVViAtp8TotNQj4kk4Q8Bh1sC/aL9aH+Rg1YAVn18OYXsRDT7U/079jgP7w==}
engines: {node: '>=20.9.0'}
hasBin: true
peerDependencies:
@@ -5129,35 +5133,35 @@ snapshots:
'@mixmark-io/domino@2.2.0': {}
'@next/env@16.0.10': {}
'@next/env@16.1.5': {}
'@next/swc-darwin-arm64@16.0.10':
'@next/swc-darwin-arm64@16.1.5':
optional: true
'@next/swc-darwin-x64@16.0.10':
'@next/swc-darwin-x64@16.1.5':
optional: true
'@next/swc-linux-arm64-gnu@16.0.10':
'@next/swc-linux-arm64-gnu@16.1.5':
optional: true
'@next/swc-linux-arm64-musl@16.0.10':
'@next/swc-linux-arm64-musl@16.1.5':
optional: true
'@next/swc-linux-x64-gnu@16.0.10':
'@next/swc-linux-x64-gnu@16.1.5':
optional: true
'@next/swc-linux-x64-musl@16.0.10':
'@next/swc-linux-x64-musl@16.1.5':
optional: true
'@next/swc-win32-arm64-msvc@16.0.10':
'@next/swc-win32-arm64-msvc@16.1.5':
optional: true
'@next/swc-win32-x64-msvc@16.0.10':
'@next/swc-win32-x64-msvc@16.1.5':
optional: true
'@next/third-parties@16.0.7(next@16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)':
'@next/third-parties@16.0.7(next@16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)':
dependencies:
next: 16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
next: 16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
react: 19.2.1
third-party-capital: 1.0.20
@@ -6403,6 +6407,8 @@ snapshots:
base64-js@0.0.8: {}
baseline-browser-mapping@2.9.19: {}
binary-extensions@2.3.0: {}
brace-expansion@2.0.1:
@@ -6415,7 +6421,7 @@ snapshots:
browserslist@4.23.2:
dependencies:
caniuse-lite: 1.0.30001643
caniuse-lite: 1.0.30001679
electron-to-chromium: 1.5.2
node-releases: 2.0.18
update-browserslist-db: 1.1.0(browserslist@4.23.2)
@@ -6867,7 +6873,7 @@ snapshots:
fsevents@2.3.3:
optional: true
fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13):
fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13):
dependencies:
'@formatjs/intl-localematcher': 0.6.2
'@orama/orama': 3.1.16
@@ -6890,21 +6896,21 @@ snapshots:
optionalDependencies:
'@types/react': 19.2.2
lucide-react: 0.552.0(react@19.2.1)
next: 16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
next: 16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
react: 19.2.1
react-dom: 19.2.1(react@19.2.1)
zod: 4.1.13
transitivePeerDependencies:
- supports-color
fumadocs-mdx@14.1.0(fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1):
fumadocs-mdx@14.1.0(fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1):
dependencies:
'@mdx-js/mdx': 3.1.1
'@standard-schema/spec': 1.0.0
chokidar: 5.0.0
esbuild: 0.27.1
estree-util-value-to-estree: 3.5.0
fumadocs-core: 16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13)
fumadocs-core: 16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13)
js-yaml: 4.1.1
mdast-util-to-markdown: 2.1.2
picocolors: 1.1.1
@@ -6918,12 +6924,12 @@ snapshots:
vfile: 6.0.3
zod: 4.1.13
optionalDependencies:
next: 16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
next: 16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
react: 19.2.1
transitivePeerDependencies:
- supports-color
fumadocs-openapi@10.1.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13))(fumadocs-ui@16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13))(prettier@3.3.3)(react-dom@19.2.1(react@19.2.1))(react@19.2.1):
fumadocs-openapi@10.1.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(fumadocs-core@16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13))(fumadocs-ui@16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13))(prettier@3.3.3)(react-dom@19.2.1(react@19.2.1))(react@19.2.1):
dependencies:
'@fumari/json-schema-to-typescript': 2.0.0(prettier@3.3.3)
'@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
@@ -6934,8 +6940,8 @@ snapshots:
'@scalar/openapi-parser': 0.23.3
ajv: 8.17.1
class-variance-authority: 0.7.1
fumadocs-core: 16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13)
fumadocs-ui: 16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13)
fumadocs-core: 16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13)
fumadocs-ui: 16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13)
github-slugger: 2.0.0
hast-util-to-jsx-runtime: 2.3.6
js-yaml: 4.1.1
@@ -6955,7 +6961,7 @@ snapshots:
- prettier
- supports-color
fumadocs-ui@16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13):
fumadocs-ui@16.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(tailwindcss@4.1.17)(zod@4.1.13):
dependencies:
'@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
'@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
@@ -6968,7 +6974,7 @@ snapshots:
'@radix-ui/react-slot': 1.2.4(@types/react@19.2.2)(react@19.2.1)
'@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
class-variance-authority: 0.7.1
fumadocs-core: 16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.0.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13)
fumadocs-core: 16.2.3(@types/react@19.2.2)(lucide-react@0.552.0(react@19.2.1))(next@16.1.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13)
lodash.merge: 4.6.2
next-themes: 0.4.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
postcss-selector-parser: 7.1.1
@@ -6979,7 +6985,7 @@ snapshots:
tailwind-merge: 3.4.0
optionalDependencies:
'@types/react': 19.2.2
next: 16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
next: 16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
tailwindcss: 4.1.17
transitivePeerDependencies:
- '@mixedbread/sdk'
@@ -7938,24 +7944,25 @@ snapshots:
react: 19.2.1
react-dom: 19.2.1(react@19.2.1)
next@16.0.10(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1):
next@16.1.5(@babel/core@7.26.9)(react-dom@19.2.1(react@19.2.1))(react@19.2.1):
dependencies:
'@next/env': 16.0.10
'@next/env': 16.1.5
'@swc/helpers': 0.5.15
baseline-browser-mapping: 2.9.19
caniuse-lite: 1.0.30001679
postcss: 8.4.31
react: 19.2.1
react-dom: 19.2.1(react@19.2.1)
styled-jsx: 5.1.6(@babel/core@7.26.9)(react@19.2.1)
optionalDependencies:
'@next/swc-darwin-arm64': 16.0.10
'@next/swc-darwin-x64': 16.0.10
'@next/swc-linux-arm64-gnu': 16.0.10
'@next/swc-linux-arm64-musl': 16.0.10
'@next/swc-linux-x64-gnu': 16.0.10
'@next/swc-linux-x64-musl': 16.0.10
'@next/swc-win32-arm64-msvc': 16.0.10
'@next/swc-win32-x64-msvc': 16.0.10
'@next/swc-darwin-arm64': 16.1.5
'@next/swc-darwin-x64': 16.1.5
'@next/swc-linux-arm64-gnu': 16.1.5
'@next/swc-linux-arm64-musl': 16.1.5
'@next/swc-linux-x64-gnu': 16.1.5
'@next/swc-linux-x64-musl': 16.1.5
'@next/swc-win32-arm64-msvc': 16.1.5
'@next/swc-win32-x64-msvc': 16.1.5
sharp: 0.34.5
transitivePeerDependencies:
- '@babel/core'
@@ -8178,7 +8185,7 @@ snapshots:
dependencies:
react: 19.2.1
react-style-singleton: 2.2.1(@types/react@19.2.2)(react@19.2.1)
tslib: 2.6.3
tslib: 2.8.1
optionalDependencies:
'@types/react': 19.2.2
@@ -8217,7 +8224,7 @@ snapshots:
get-nonce: 1.0.1
invariant: 2.2.4
react: 19.2.1
tslib: 2.6.3
tslib: 2.8.1
optionalDependencies:
'@types/react': 19.2.2
@@ -8780,7 +8787,7 @@ snapshots:
use-callback-ref@1.3.2(@types/react@19.2.2)(react@19.2.1):
dependencies:
react: 19.2.1
tslib: 2.6.3
tslib: 2.8.1
optionalDependencies:
'@types/react': 19.2.2
@@ -8795,7 +8802,7 @@ snapshots:
dependencies:
detect-node-es: 1.1.0
react: 19.2.1
tslib: 2.6.3
tslib: 2.8.1
optionalDependencies:
'@types/react': 19.2.2