diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
new file mode 100644
index 000000000..4ffcfaed7
--- /dev/null
+++ b/.devcontainer/Dockerfile
@@ -0,0 +1,21 @@
+# Dockerfile for DevContainer
+FROM node:24.4.0-bullseye-slim
+
+# Install essential packages
+RUN apt-get update && apt-get install -y \
+ curl \
+ bash \
+ git \
+ && apt-get clean \
+ && rm -rf /var/lib/apt/lists/*
+
+# Set up PNPM
+ENV PNPM_HOME="/pnpm"
+ENV PATH="$PNPM_HOME:$PATH"
+RUN corepack enable && corepack prepare pnpm@10.22.0 --activate
+
+# Create workspace directory
+WORKDIR /workspaces/dokploy
+
+# Set up user permissions
+USER node
\ No newline at end of file
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
new file mode 100644
index 000000000..eafddd06d
--- /dev/null
+++ b/.devcontainer/devcontainer.json
@@ -0,0 +1,53 @@
+{
+ "name": "Dokploy development container",
+ "build": {
+ "dockerfile": "Dockerfile",
+ "context": ".."
+ },
+ "features": {
+ "ghcr.io/devcontainers/features/docker-in-docker:2": {
+ "moby": true,
+ "version": "latest"
+ },
+ "ghcr.io/devcontainers/features/git:1": {
+ "ppa": true,
+ "version": "latest"
+ },
+ "ghcr.io/devcontainers/features/go:1": {
+ "version": "1.20"
+ }
+ },
+ "customizations": {
+ "vscode": {
+ "extensions": [
+ "ms-vscode.vscode-typescript-next",
+ "bradlc.vscode-tailwindcss",
+ "ms-vscode.vscode-json",
+ "biomejs.biome",
+ "golang.go",
+ "redhat.vscode-xml",
+ "github.vscode-github-actions",
+ "github.copilot",
+ "github.copilot-chat"
+ ]
+ }
+ },
+ "forwardPorts": [3000, 5432, 6379],
+ "portsAttributes": {
+ "3000": {
+ "label": "Dokploy App",
+ "onAutoForward": "notify"
+ },
+ "5432": {
+ "label": "PostgreSQL",
+ "onAutoForward": "silent"
+ },
+ "6379": {
+ "label": "Redis",
+ "onAutoForward": "silent"
+ }
+ },
+ "remoteUser": "node",
+ "workspaceFolder": "/workspaces/dokploy",
+ "runArgs": ["--name", "dokploy-devcontainer"]
+}
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 0b849afc0..e210811b0 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -6,9 +6,9 @@ Please describe in a short paragraph what this PR is about.
Before submitting this PR, please make sure that:
-- [] You created a dedicated branch based on the `canary` branch.
-- [] You have read the suggestions in the CONTRIBUTING.md file https://github.com/Dokploy/dokploy/blob/canary/CONTRIBUTING.md#pull-request
-- [] You have tested this PR in your local instance.
+- [ ] You created a dedicated branch based on the `canary` branch.
+- [ ] You have read the suggestions in the CONTRIBUTING.md file https://github.com/Dokploy/dokploy/blob/canary/CONTRIBUTING.md#pull-request
+- [ ] You have tested this PR in your local instance. If you have not tested it yet, please do so before submitting. This helps avoid wasting maintainers' time reviewing code that has not been verified by you.
## Issues related (if applicable)
diff --git a/.github/sponsors/awesome.png b/.github/sponsors/awesome.png
new file mode 100644
index 000000000..0753212ab
Binary files /dev/null and b/.github/sponsors/awesome.png differ
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 3ed957b72..321fb2029 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -13,6 +13,17 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v3
+ - name: Set tag and version
+ id: meta-cloud
+ run: |
+ VERSION=$(jq -r .version apps/dokploy/package.json)
+ echo "version=$VERSION" >> $GITHUB_OUTPUT
+ if [ "${{ github.ref }}" = "refs/heads/main" ]; then
+ echo "tags=siumauricio/cloud:latest,siumauricio/cloud:${VERSION}" >> $GITHUB_OUTPUT
+ else
+ echo "tags=siumauricio/cloud:canary" >> $GITHUB_OUTPUT
+ fi
+
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
@@ -25,8 +36,7 @@ jobs:
context: .
file: ./Dockerfile.cloud
push: true
- tags: |
- siumauricio/cloud:${{ github.ref_name == 'main' && 'latest' || 'canary' }}
+ tags: ${{ steps.meta-cloud.outputs.tags }}
platforms: linux/amd64
build-args: |
NEXT_PUBLIC_UMAMI_HOST=${{ secrets.NEXT_PUBLIC_UMAMI_HOST }}
@@ -40,6 +50,16 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v3
+ - name: Set tag and version
+ id: meta-schedule
+ run: |
+ VERSION=$(jq -r .version apps/dokploy/package.json)
+ if [ "${{ github.ref }}" = "refs/heads/main" ]; then
+ echo "tags=siumauricio/schedule:latest,siumauricio/schedule:${VERSION}" >> $GITHUB_OUTPUT
+ else
+ echo "tags=siumauricio/schedule:canary" >> $GITHUB_OUTPUT
+ fi
+
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
@@ -52,8 +72,7 @@ jobs:
context: .
file: ./Dockerfile.schedule
push: true
- tags: |
- siumauricio/schedule:${{ github.ref_name == 'main' && 'latest' || 'canary' }}
+ tags: ${{ steps.meta-schedule.outputs.tags }}
platforms: linux/amd64
build-and-push-server-image:
@@ -63,6 +82,16 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v3
+ - name: Set tag and version
+ id: meta-server
+ run: |
+ VERSION=$(jq -r .version apps/dokploy/package.json)
+ if [ "${{ github.ref }}" = "refs/heads/main" ]; then
+ echo "tags=siumauricio/server:latest,siumauricio/server:${VERSION}" >> $GITHUB_OUTPUT
+ else
+ echo "tags=siumauricio/server:canary" >> $GITHUB_OUTPUT
+ fi
+
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
@@ -75,6 +104,5 @@ jobs:
context: .
file: ./Dockerfile.server
push: true
- tags: |
- siumauricio/server:${{ github.ref_name == 'main' && 'latest' || 'canary' }}
+ tags: ${{ steps.meta-server.outputs.tags }}
platforms: linux/amd64
diff --git a/.github/workflows/pr-quality.yml b/.github/workflows/pr-quality.yml
new file mode 100644
index 000000000..3554babb2
--- /dev/null
+++ b/.github/workflows/pr-quality.yml
@@ -0,0 +1,22 @@
+
+name: PR Quality
+
+permissions:
+ contents: read
+ issues: read
+ pull-requests: write
+
+on:
+ pull_request_target:
+ types: [opened, reopened]
+
+jobs:
+ anti-slop:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: peakoss/anti-slop@v0
+ with:
+ max-failures: 4
+ blocked-commit-authors: "claude,copilot"
+ require-description: true
+ min-account-age: 5
diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml
index 6c74dbc02..2ad24fc0c 100644
--- a/.github/workflows/pull-request.yml
+++ b/.github/workflows/pull-request.yml
@@ -18,8 +18,34 @@ jobs:
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
- node-version: 20.16.0
+ node-version: 24.4.0
cache: "pnpm"
+
+ - name: Install Nixpacks
+ if: matrix.job == 'test'
+ run: |
+ export NIXPACKS_VERSION=1.41.0
+ curl -sSL https://nixpacks.com/install.sh | bash
+ echo "Nixpacks installed $NIXPACKS_VERSION"
+
+ - name: Install Railpack
+ if: matrix.job == 'test'
+ run: |
+ export RAILPACK_VERSION=0.15.4
+ curl -sSL https://railpack.com/install.sh | bash
+ echo "Railpack installed $RAILPACK_VERSION"
+
+ - name: Add build tools to PATH
+ if: matrix.job == 'test'
+ run: echo "$HOME/.local/bin" >> $GITHUB_PATH
+
+ - name: Initialize Docker Swarm
+ if: matrix.job == 'test'
+ run: |
+ docker swarm init
+ docker network create --driver overlay dokploy-network || true
+ echo "✅ Docker Swarm initialized"
+
- run: pnpm install --frozen-lockfile
- run: pnpm server:build
- run: pnpm ${{ matrix.job }}
diff --git a/.github/workflows/sync-openapi-docs.yml b/.github/workflows/sync-openapi-docs.yml
new file mode 100644
index 000000000..549af945b
--- /dev/null
+++ b/.github/workflows/sync-openapi-docs.yml
@@ -0,0 +1,70 @@
+name: Generate and Sync OpenAPI
+
+on:
+ push:
+ branches:
+ - canary
+ - main
+ paths:
+ - 'apps/dokploy/server/api/routers/**'
+ - 'packages/server/src/services/**'
+ - 'packages/server/src/db/schema/**'
+
+ workflow_dispatch:
+
+jobs:
+ generate-and-commit:
+ name: Generate OpenAPI and commit to Dokploy repo
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout Dokploy repository
+ uses: actions/checkout@v4
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ - uses: pnpm/action-setup@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version: 24.4.0
+ cache: "pnpm"
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Generate OpenAPI specification
+ run: |
+ pnpm generate:openapi
+
+ # Verifica que se generó correctamente
+ if [ ! -f openapi.json ]; then
+ echo "❌ openapi.json not found"
+ exit 1
+ fi
+
+ echo "✅ OpenAPI specification generated successfully"
+
+ - name: Sync to website repository
+ run: |
+ # Clona el repositorio de website
+ git clone https://x-access-token:${{ secrets.DOCS_SYNC_TOKEN }}@github.com/dokploy/website.git website-repo
+
+ cd website-repo
+
+ # Copia el openapi.json al website (sobrescribe)
+ mkdir -p apps/docs/public
+ cp -f ../openapi.json apps/docs/public/openapi.json
+
+ # Configura git
+ git config user.name "Dokploy Bot"
+ git config user.email "bot@dokploy.com"
+
+ # Agrega y commitea siempre
+ git add apps/docs/public/openapi.json
+ git commit -m "chore: sync OpenAPI specification [skip ci]" \
+ -m "Source: ${{ github.repository }}@${{ github.sha }}" \
+ -m "Updated: $(date -u +'%Y-%m-%d %H:%M:%S UTC')" \
+ --allow-empty
+
+ git push
+
+ echo "✅ OpenAPI synced to website successfully"
+
diff --git a/.gitignore b/.gitignore
index 5e6e4eb3c..d531bab01 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,8 @@ node_modules
.env.test.local
.env.production.local
+openapi.json
+
# Testing
coverage
diff --git a/.nvmrc b/.nvmrc
index 593cb75bc..84e5de6ef 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-20.16.0
\ No newline at end of file
+24.4.0
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 38a36345e..ad37899e6 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -2,7 +2,7 @@
Hey, thanks for your interest in contributing to Dokploy! We appreciate your help and taking your time to contribute.
-Before you start, please first discuss the feature/bug you want to add with the owners and comunity via github issues.
+Before you start, please first discuss the feature/bug you want to add with the owners and community via github issues.
We have a few guidelines to follow when contributing to this project:
@@ -11,6 +11,7 @@ We have a few guidelines to follow when contributing to this project:
- [Development](#development)
- [Build](#build)
- [Pull Request](#pull-request)
+- [Important Considerations](#important-considerations-for-pull-requests)
## Commit Convention
@@ -52,7 +53,7 @@ feat: add new feature
Before you start, please make the clone based on the `canary` branch, since the `main` branch is the source of truth and should always reflect the latest stable release, also the PRs will be merged to the `canary` branch.
-We use Node v20.16.0 and recommend this specific version. If you have nvm installed, you can run `nvm install 20.16.0 && nvm use` in the root directory.
+We use Node v24.4.0 and recommend this specific version. If you have nvm installed, you can run `nvm install 24.4.0 && nvm use` in the root directory.
```bash
git clone https://github.com/dokploy/dokploy.git
@@ -148,7 +149,7 @@ curl -sSL https://railpack.com/install.sh | sh
```bash
# Install Buildpacks
-curl -sSL "https://github.com/buildpacks/pack/releases/download/v0.35.0/pack-v0.35.0-linux.tgz" | tar -C /usr/local/bin/ --no-same-owner -xzv pack
+curl -sSL "https://github.com/buildpacks/pack/releases/download/v0.39.1/pack-v0.39.1-linux.tgz" | tar -C /usr/local/bin/ --no-same-owner -xzv pack
```
## Pull Request
@@ -162,11 +163,13 @@ curl -sSL "https://github.com/buildpacks/pack/releases/download/v0.35.0/pack-v0.
- If your pull request fixes an open issue, please reference the issue in the pull request description.
- Once your pull request is merged, you will be automatically added as a contributor to the project.
-**Important Considerations for Pull Requests:**
+### Important Considerations for Pull Requests
+- **Testing is Mandatory:** All Pull Requests **must be tested** by the PR author before submission. You must verify that your changes work as expected in a local development environment (see [Setup](#setup)). **Pull Requests that have not been tested by their creator will be rejected.** This policy keeps the PR history clean and values contributors who submit verified, working code. Untested PRs are often recognizable by disproportionately large or scattered changes for simple tasks—please test first.
- **Focus and Scope:** Each Pull Request should ideally address a single, well-defined problem or introduce one new feature. This greatly facilitates review and reduces the chances of introducing unintended side effects.
- **Avoid Unfocused Changes:** Please avoid submitting Pull Requests that contain only minor changes such as whitespace adjustments, IDE-generated formatting, or removal of unused variables, unless these are part of a larger, clearly defined refactor or a dedicated "cleanup" Pull Request that addresses a specific `good first issue` or maintenance task.
- **Issue Association:** For any significant change, it's highly recommended to open an issue first to discuss the proposed solution with the community and maintainers. This ensures alignment and avoids duplicated effort. If your PR resolves an existing issue, please link it in the description (e.g., `Fixes #123`, `Closes #456`).
+- **Large Features:** Pull Requests that introduce very large or broad features **will not be accepted** unless the idea is first outlined and discussed in a GitHub issue. Large features should be designed together with the Dokploy team so the project stays coherent and moves in the same direction. Open an issue to propose and align on the design before implementing.
Thank you for your contribution!
diff --git a/Dockerfile b/Dockerfile
index 11310b18e..ed936508f 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,9 +1,9 @@
# syntax=docker/dockerfile:1
-FROM node:20.16.0-slim AS base
+FROM node:24.4.0-slim AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
RUN corepack enable
-RUN corepack prepare pnpm@9.12.0 --activate
+RUN corepack prepare pnpm@10.22.0 --activate
FROM base AS build
COPY . /usr/src/app
@@ -20,7 +20,7 @@ ENV NODE_ENV=production
RUN pnpm --filter=@dokploy/server build
RUN pnpm --filter=./apps/dokploy run build
-RUN pnpm --filter=./apps/dokploy --prod deploy /prod/dokploy
+RUN pnpm --filter=./apps/dokploy --prod deploy --legacy /prod/dokploy
RUN cp -R /usr/src/app/apps/dokploy/.next /prod/dokploy/.next
RUN cp -R /usr/src/app/apps/dokploy/dist /prod/dokploy/dist
@@ -46,23 +46,27 @@ COPY --from=build /prod/dokploy/node_modules ./node_modules
# Install docker
-RUN curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh && rm get-docker.sh && curl https://rclone.org/install.sh | bash
+RUN curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh --version 28.5.2 && rm get-docker.sh && curl https://rclone.org/install.sh | bash
# Install Nixpacks and tsx
# | VERBOSE=1 VERSION=1.21.0 bash
-ARG NIXPACKS_VERSION=1.39.0
+ARG NIXPACKS_VERSION=1.41.0
RUN curl -sSL https://nixpacks.com/install.sh -o install.sh \
&& chmod +x install.sh \
&& ./install.sh \
&& pnpm install -g tsx
# Install Railpack
-ARG RAILPACK_VERSION=0.2.2
+ARG RAILPACK_VERSION=0.15.4
RUN curl -sSL https://railpack.com/install.sh | bash
# Install buildpacks
-COPY --from=buildpacksio/pack:0.35.0 /usr/local/bin/pack /usr/local/bin/pack
+COPY --from=buildpacksio/pack:0.39.1 /usr/local/bin/pack /usr/local/bin/pack
EXPOSE 3000
-CMD [ "pnpm", "start" ]
+
+HEALTHCHECK --interval=10s --timeout=3s --retries=10 \
+ CMD curl -fs http://localhost:3000/api/trpc/settings.health || exit 1
+
+ CMD ["sh", "-c", "pnpm run wait-for-postgres && exec pnpm start"]
diff --git a/Dockerfile.cloud b/Dockerfile.cloud
index 8e4bac215..05e7cde49 100644
--- a/Dockerfile.cloud
+++ b/Dockerfile.cloud
@@ -1,9 +1,9 @@
# syntax=docker/dockerfile:1
-FROM node:20.16.0-slim AS base
+FROM node:24.4.0-slim AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
RUN corepack enable
-RUN corepack prepare pnpm@9.12.0 --activate
+RUN corepack prepare pnpm@10.22.0 --activate
FROM base AS build
COPY . /usr/src/app
@@ -16,11 +16,11 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm --filter=@dokploy/server
# Deploy only the dokploy app
-ARG NEXT_PUBLIC_UMAMI_HOST
-ENV NEXT_PUBLIC_UMAMI_HOST=$NEXT_PUBLIC_UMAMI_HOST
+# ARG NEXT_PUBLIC_UMAMI_HOST
+# ENV NEXT_PUBLIC_UMAMI_HOST=$NEXT_PUBLIC_UMAMI_HOST
-ARG NEXT_PUBLIC_UMAMI_WEBSITE_ID
-ENV NEXT_PUBLIC_UMAMI_WEBSITE_ID=$NEXT_PUBLIC_UMAMI_WEBSITE_ID
+# ARG NEXT_PUBLIC_UMAMI_WEBSITE_ID
+# ENV NEXT_PUBLIC_UMAMI_WEBSITE_ID=$NEXT_PUBLIC_UMAMI_WEBSITE_ID
ARG NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY
ENV NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=$NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY
@@ -29,7 +29,7 @@ ENV NODE_ENV=production
RUN pnpm --filter=@dokploy/server build
RUN pnpm --filter=./apps/dokploy run build
-RUN pnpm --filter=./apps/dokploy --prod deploy /prod/dokploy
+RUN pnpm --filter=./apps/dokploy --prod deploy --legacy /prod/dokploy
RUN cp -R /usr/src/app/apps/dokploy/.next /prod/dokploy/.next
RUN cp -R /usr/src/app/apps/dokploy/dist /prod/dokploy/dist
@@ -60,4 +60,4 @@ RUN curl https://rclone.org/install.sh | bash
RUN pnpm install -g tsx
EXPOSE 3000
-CMD [ "pnpm", "start" ]
\ No newline at end of file
+CMD [ "pnpm", "start" ]
diff --git a/Dockerfile.schedule b/Dockerfile.schedule
index ecb125e09..81b13fd64 100644
--- a/Dockerfile.schedule
+++ b/Dockerfile.schedule
@@ -1,9 +1,9 @@
# syntax=docker/dockerfile:1
-FROM node:20.16.0-slim AS base
+FROM node:24.4.0-slim AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
RUN corepack enable
-RUN corepack prepare pnpm@9.12.0 --activate
+RUN corepack prepare pnpm@10.22.0 --activate
FROM base AS build
COPY . /usr/src/app
@@ -20,7 +20,7 @@ ENV NODE_ENV=production
RUN pnpm --filter=@dokploy/server build
RUN pnpm --filter=./apps/schedules run build
-RUN pnpm --filter=./apps/schedules --prod deploy /prod/schedules
+RUN pnpm --filter=./apps/schedules --prod deploy --legacy /prod/schedules
RUN cp -R /usr/src/app/apps/schedules/dist /prod/schedules/dist
@@ -35,4 +35,5 @@ COPY --from=build /prod/schedules/dist ./dist
COPY --from=build /prod/schedules/package.json ./package.json
COPY --from=build /prod/schedules/node_modules ./node_modules
-CMD HOSTNAME=0.0.0.0 && pnpm start
\ No newline at end of file
+ENV HOSTNAME=0.0.0.0
+CMD ["pnpm", "start"]
diff --git a/Dockerfile.server b/Dockerfile.server
index ea6b372e8..8990ece4d 100644
--- a/Dockerfile.server
+++ b/Dockerfile.server
@@ -1,9 +1,9 @@
# syntax=docker/dockerfile:1
-FROM node:20.16.0-slim AS base
+FROM node:24.4.0-slim AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
RUN corepack enable
-RUN corepack prepare pnpm@9.12.0 --activate
+RUN corepack prepare pnpm@10.22.0 --activate
FROM base AS build
COPY . /usr/src/app
@@ -20,7 +20,7 @@ ENV NODE_ENV=production
RUN pnpm --filter=@dokploy/server build
RUN pnpm --filter=./apps/api run build
-RUN pnpm --filter=./apps/api --prod deploy /prod/api
+RUN pnpm --filter=./apps/api --prod deploy --legacy /prod/api
RUN cp -R /usr/src/app/apps/api/dist /prod/api/dist
@@ -35,4 +35,5 @@ COPY --from=build /prod/api/dist ./dist
COPY --from=build /prod/api/package.json ./package.json
COPY --from=build /prod/api/node_modules ./node_modules
-CMD HOSTNAME=0.0.0.0 && pnpm start
\ No newline at end of file
+ENV HOSTNAME=0.0.0.0
+CMD ["pnpm", "start"]
diff --git a/LICENSE.MD b/LICENSE.MD
index 6cbef2c6d..bcef8b36e 100644
--- a/LICENSE.MD
+++ b/LICENSE.MD
@@ -1,8 +1,13 @@
-# License
+Copyright 2026-present Dokploy Technology, Inc.
-## Core License (Apache License 2.0)
+Portions of this software are licensed as follows:
-Copyright 2025 Mauricio Siu.
+* All content that resides under a "/proprietary" directory of this repository, if that directory exists, is licensed under the license defined in "LICENSE_PROPRIETARY".
+* Content outside of the above mentioned directories or restrictions above is available under the "Apache License 2.0" license as defined below.
+
+## Apache License 2.0
+
+Copyright 2026-present Dokploy Technology, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -15,12 +20,4 @@ distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and limitations under the License.
-## Additional Terms for Specific Features
-The following additional terms apply to the multi-node support, Docker Compose file, Preview Deployments and Multi Server features of Dokploy. In the event of a conflict, these provisions shall take precedence over those in the Apache License:
-
-- **Self-Hosted Version Free**: All features of Dokploy, including multi-node support, Docker Compose file support, Schedules, Preview Deployments and Multi Server, will always be free to use in the self-hosted version.
-- **Restriction on Resale**: The multi-node support, Docker Compose file support, Schedules, Preview Deployments and Multi Server features cannot be sold or offered as a service by any party other than the copyright holder without prior written consent.
-- **Modification Distribution**: Any modifications to the multi-node support, Docker Compose file support, Schedules, Preview Deployments and Multi Server features must be distributed freely and cannot be sold or offered as a service.
-
-For further inquiries or permissions, please contact us directly.
diff --git a/LICENSE_PROPRIETARY.md b/LICENSE_PROPRIETARY.md
new file mode 100644
index 000000000..0f4957575
--- /dev/null
+++ b/LICENSE_PROPRIETARY.md
@@ -0,0 +1,11 @@
+The Dokploy Source Available license (DSAL) version 1.0
+
+Copyright (c) 2026-present Dokploy Technology, Inc.
+
+With regard to the Dokploy Software:This software and associated documentation files (the "Software") may only beused in production, if you (and any entity that you represent) have agreed to, and are in compliance with, a valid commercial agreement from Dokploy.Subject to the foregoing sentence, you are free to modify this Software and publish patches to the Software. You agree that Dokploy and/or its licensors (as applicable) retain all right, title and interest in and to all such modifications and/or patches, and all such modifications and/or patches may only be used, copied, modified, displayed, distributed, or otherwise exploited with a valid Dokploy Source Available License. Notwithstanding the foregoing, you may copy and modify the Software for development and testing purposes, without requiring a subscription. You agree that Dokploy and/or its licensors (as applicable) retain all right, title and interest in and to all such modifications. You are not granted any other rights beyond what is expressly stated herein. Subject to theforegoing, it is forbidden to copy, merge, publish, distribute, sublicense,and/or sell the Software.
+
+This Dokploy Source Available license applies only to the part of this Software that is in a /proprietary folder. The full text of this License shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THESOFTWARE.
+
+For all third party components incorporated into the Dokploy Software, thosecomponents are licensed under the original license provided by the owner of the applicable component.
\ No newline at end of file
diff --git a/README.md b/README.md
index 3c9bfd68b..2ddc1f498 100644
--- a/README.md
+++ b/README.md
@@ -11,19 +11,6 @@
-
-
-
-### [Tuple, the premier screen sharing app for developers](https://tuple.app/dokploy)
-
-[Available for MacOS & Windows](https://tuple.app/dokploy)