-
-
- 🚀 {t("hero.cloud")}
-
-
+
+
+
+
+ 🎉
{" "}
+
+ Introducing Dokploy Cloud
+
+
+
-
-
+
-
- {t("hero.deploy")}{" "}
-
-
- {t("hero.anywhere")}
- {" "}
- {t("hero.with")}
-
-
- {t("hero.des")}
-
-
-
-
- curl -sSL https://dokploy.com/install.sh | sh
-
-
- {/*
+
-
-
-
-
- {/*
-
- {t("hero.featuredIn")}
-
-
- {[
- [
- { name: "Product Hunt", logo: },
- // { name: "Hacker News", logo: },
- ],
- ].map((group, groupIndex) => (
- -
-
- {group.map((company) => (
- -
- {company.logo}
-
- ))}
-
-
- ))}
-
-
*/}
+
+
+
+
+
);
diff --git a/apps/website/components/PrimaryFeatures.tsx b/apps/website/components/PrimaryFeatures.tsx
index ef4ecfd..4a0b4b3 100644
--- a/apps/website/components/PrimaryFeatures.tsx
+++ b/apps/website/components/PrimaryFeatures.tsx
@@ -7,17 +7,13 @@ import { useEffect, useState } from "react";
import { cn } from "@/lib/utils";
import { useTranslations } from "next-intl";
import { Container } from "./Container";
+import Safari from "./ui/safari";
const features = [
- {
- title: "primaryFeatures.projects",
- description: "primaryFeatures.projectsDes",
- image: "/primary/projects.png",
- },
{
title: "primaryFeatures.applications",
description: "primaryFeatures.applicationsDes",
- image: "/primary/applications.png",
+ image: "/primary/primary.png",
},
{
title: "primaryFeatures.compose",
@@ -25,9 +21,9 @@ const features = [
image: "/primary/compose.png",
},
{
- title: "primaryFeatures.multinode",
- description: "primaryFeatures.multinodeDes",
- image: "/primary/multinode.png",
+ title: "primaryFeatures.multiserver",
+ description: "primaryFeatures.multiserverDes",
+ image: "/primary/servers.png",
},
{
title: "primaryFeatures.monitoring",
@@ -39,6 +35,11 @@ const features = [
description: "primaryFeatures.backupsDes",
image: "/primary/backups.png",
},
+ {
+ title: "primaryFeatures.traefik",
+ description: "primaryFeatures.traefikDes",
+ image: "/primary/traefik.png",
+ },
];
export function PrimaryFeatures() {
@@ -85,7 +86,7 @@ export function PrimaryFeatures() {
height={1636}
unoptimized
/> */}
-
+
{t("primaryFeatures.title")}
@@ -96,16 +97,16 @@ export function PrimaryFeatures() {
{({ selectedIndex }) => (
<>
-
+
{features.map((feature, featureIndex) => (
{selectedIndex === featureIndex && (
-
+
{t(feature.title)}
{t(feature.description)}
@@ -153,34 +154,35 @@ export function PrimaryFeatures() {
))}
-
+
{features.map((feature, index) => (
-
+
-
+
{t(feature.description)}
-
+
+
+
))}
@@ -188,7 +190,7 @@ export function PrimaryFeatures() {
>
)}
-
+
);
}
diff --git a/apps/website/components/Testimonials.tsx b/apps/website/components/Testimonials.tsx
index ad06cfc..7e6df4b 100644
--- a/apps/website/components/Testimonials.tsx
+++ b/apps/website/components/Testimonials.tsx
@@ -1,4 +1,7 @@
+"use client";
+import { cn } from "@/lib/utils";
import { Container } from "./Container";
+import { Marquee } from "./ui/marquee";
const testimonials = [
[
@@ -71,64 +74,144 @@ function QuoteIcon(props: React.ComponentPropsWithoutRef<"svg">) {
);
}
+const reviews = [
+ {
+ name: "Duras",
+ username: "@duras",
+ body: "This app convinced me to try something beyond pure Docker Compose. It’s a pleasure to contribute to such an awesome project!",
+ img: "https://avatar.vercel.sh/duras",
+ },
+ {
+ name: "apis",
+ username: "@apis",
+ body: "I replaced my previous setup with Dokploy today. It’s stable, easy to use, and offers excellent support!",
+ img: "https://avatar.vercel.sh/apis",
+ },
+ {
+ name: "yayza_",
+ username: "@yayza_",
+ body: "Migrated all my services to Dokploy—it worked seamlessly! The level of configuration is perfect for all kinds of projects.",
+ img: "https://avatar.vercel.sh/yayza",
+ },
+ {
+ name: "Vaurion",
+ username: "@vaurion",
+ body: "Dokploy makes my deployments incredibly easy. I just test locally, push a preview to GitHub, and Dokploy takes care of the rest.",
+ img: "https://avatar.vercel.sh/vaurion",
+ },
+ {
+ name: "vinum?",
+ username: "@vinum",
+ body: "Dokploy is everything I wanted in a PaaS. The functionality is impressive, and it's completely free!",
+ img: "https://avatar.vercel.sh/vinum",
+ },
+ {
+ name: "vadzim",
+ username: "@vadzim",
+ body: "Dokploy is fantastic! I rarely encounter any deployment issues, and the community support is top-notch.",
+ img: "https://avatar.vercel.sh/vadzim",
+ },
+ {
+ name: "Slurpy Beckerman",
+ username: "@slurpy",
+ body: "This is exactly what I want in a deployment system. I’ve restructured my dev process around Dokploy!",
+ img: "https://avatar.vercel.sh/slurpy",
+ },
+ {
+ name: "lua",
+ username: "@lua",
+ body: "Dokploy is genuinely so nice to use. The hard work behind it really shows.",
+ img: "https://avatar.vercel.sh/lua",
+ },
+ {
+ name: "johnnygri",
+ username: "@johnnygri",
+ body: "Dokploy is a complete joy to use. I’m running a mix of critical and low-priority services seamlessly across servers.",
+ img: "https://avatar.vercel.sh/johnnygri",
+ },
+ {
+ name: "HiJoe",
+ username: "@hijoe",
+ body: "Setting up Dokploy was great—simple, intuitive, and reliable. Perfect for small to medium-sized businesses.",
+ img: "https://avatar.vercel.sh/hijoe",
+ },
+ {
+ name: "johannes0910",
+ username: "@johannes0910",
+ body: "Dokploy has been a game-changer for my side projects. Solid UI, straightforward Docker abstraction, and great design.",
+ img: "https://avatar.vercel.sh/johannes0910",
+ },
+];
+
+const firstRow = reviews.slice(0, reviews.length / 2);
+const secondRow = reviews.slice(reviews.length / 2);
+
+const ReviewCard = ({
+ img,
+ name,
+ username,
+ body,
+}: {
+ img: string;
+ name: string;
+ username: string;
+ body: string;
+}) => {
+ return (
+
+
+

+
+
+ {name}
+
+
{username}
+
+
+ {body}
+
+ );
+};
+
export function Testimonials() {
return (
-
-
-
- What Our Users Say
-
-
- Don’t just take our word for it—see what our users across the globe
- are saying about how our platform has transformed their development
- workflows and boosted their productivity.
-
-
-
);
}
diff --git a/apps/website/components/features-second.tsx b/apps/website/components/features-second.tsx
new file mode 100644
index 0000000..4528e7c
--- /dev/null
+++ b/apps/website/components/features-second.tsx
@@ -0,0 +1,233 @@
+import { cn } from "@/lib/utils";
+import { IconBrandYoutubeFilled } from "@tabler/icons-react";
+import { motion } from "framer-motion";
+import Image from "next/image";
+import Link from "next/link";
+import type React from "react";
+import { useEffect, useRef } from "react";
+
+export function FeaturesSectionDemo() {
+ const features = [
+ {
+ title: "Track issues effectively",
+ description:
+ "Track and manage your project issues with ease using our intuitive interface.",
+ skeleton: ,
+ className:
+ "col-span-1 lg:col-span-4 border-b lg:border-r dark:border-neutral-800",
+ },
+ {
+ title: "Capture pictures with AI",
+ description:
+ "Capture stunning photos effortlessly using our advanced AI technology.",
+ skeleton: ,
+ className: "border-b col-span-1 lg:col-span-2 dark:border-neutral-800",
+ },
+ {
+ title: "Watch our AI on YouTube",
+ description:
+ "Whether its you or Tyler Durden, you can get to know about our product on YouTube",
+ skeleton: ,
+ className:
+ "col-span-1 lg:col-span-3 lg:border-r dark:border-neutral-800",
+ },
+ {
+ title: "Deploy in seconds",
+ description:
+ "With our blazing fast, state of the art, cutting edge, we are so back cloud servies (read AWS) - you can deploy your model in seconds.",
+ skeleton: ,
+ className: "col-span-1 lg:col-span-3 border-b lg:border-none",
+ },
+ ];
+ return (
+
+
+
+ Packed with thousands of features
+
+
+
+ From Image generation to video generation, Everything AI has APIs for
+ literally everything. It can even create this website copy for you.
+
+
+
+
+
+ {features.map((feature) => (
+
+ {feature.title}
+ {feature.description}
+ {feature.skeleton}
+
+ ))}
+
+
+
+ );
+}
+
+const FeatureCard = ({
+ children,
+ className,
+}: {
+ children?: React.ReactNode;
+ className?: string;
+}) => {
+ return (
+
+ {children}
+
+ );
+};
+
+const FeatureTitle = ({ children }: { children?: React.ReactNode }) => {
+ return (
+
+ {children}
+
+ );
+};
+
+const FeatureDescription = ({ children }: { children?: React.ReactNode }) => {
+ return (
+
+ {children}
+
+ );
+};
+
+export const SkeletonOne = () => {
+ return (
+
+ );
+};
+
+export const SkeletonThree = () => {
+ return (
+
+
+
+ );
+};
+
+export const SkeletonTwo = () => {
+ const images = [
+ "https://images.unsplash.com/photo-1517322048670-4fba75cbbb62?q=80&w=3000&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",
+ "https://images.unsplash.com/photo-1573790387438-4da905039392?q=80&w=3425&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",
+ "https://images.unsplash.com/photo-1555400038-63f5ba517a47?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",
+ "https://images.unsplash.com/photo-1554931670-4ebfabf6e7a9?q=80&w=3387&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",
+ "https://images.unsplash.com/photo-1546484475-7f7bd55792da?q=80&w=2581&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",
+ ];
+
+ const imageVariants = {
+ whileHover: {
+ scale: 1.1,
+ rotate: 0,
+ zIndex: 100,
+ },
+ whileTap: {
+ scale: 1.1,
+ rotate: 0,
+ zIndex: 100,
+ },
+ };
+ return (
+
+ {/* TODO */}
+
+ {images.map((image, idx) => (
+
+
+
+ ))}
+
+
+ {images.map((image, idx) => (
+
+
+
+ ))}
+
+
+
+
+
+ );
+};
+
+export const SkeletonFour = () => {
+ return (
+
+ {/* */}
+
+ );
+};
diff --git a/apps/website/components/features.tsx b/apps/website/components/features.tsx
new file mode 100644
index 0000000..68be0cf
--- /dev/null
+++ b/apps/website/components/features.tsx
@@ -0,0 +1,148 @@
+"use client";
+import { cn } from "@/lib/utils";
+import {
+ IconActivity,
+ IconCloud,
+ IconDatabase,
+ IconEaseInOut,
+ IconRocket,
+ IconTemplate,
+ IconTerminal,
+ IconTerminal2,
+ IconUsers,
+} from "@tabler/icons-react";
+import { Layers, Lock, UnlockIcon } from "lucide-react";
+
+export function FeaturesSectionDemo() {
+ const features = [
+ {
+ title: "Flexible Application Deployment",
+ description:
+ "Deploy any application using Nixpacks, Heroku Buildpacks, or your custom Dockerfile, tailored to your stack.",
+ icon: ,
+ },
+ {
+ title: "Native Docker Compose Support",
+ description:
+ "Deploy complex applications natively with full Docker Compose integration for seamless orchestration.",
+ icon: ,
+ },
+ {
+ title: "Multi-server Support",
+ description:
+ "Effortlessly deploy your applications on remote servers, with zero configuration hassle.",
+ icon: ,
+ },
+ {
+ title: "Advanced User Management",
+ description:
+ "Control user access with detailed roles and permissions, keeping your deployments secure and organized.",
+ icon: ,
+ },
+ {
+ title: "Database Management with Backups",
+ description:
+ "Manage and back up MySQL, PostgreSQL, MongoDB, MariaDB, Redis directly from Dokploy.",
+ icon: ,
+ },
+ {
+ title: "API & CLI Access",
+ description:
+ "Need custom functionality? Dokploy offers complete API and CLI access to fit your needs.",
+ icon: ,
+ },
+ {
+ title: "Docker Swarm Clusters",
+ description:
+ "Scale your deployments seamlessly with built-in Docker Swarm support for robust, multi-node applications.",
+ icon: ,
+ },
+ {
+ title: "Open Source Templates",
+ description:
+ "Get started quickly with pre-configured templates for popular tools like Supabase, Cal.com, and Pocketbase.",
+ icon: ,
+ },
+ {
+ title: "No Vendor Lock-In",
+ description:
+ "Experience complete freedom to modify, scale, and customize Dokploy to suit your specific needs.",
+ icon: ,
+ },
+ {
+ title: "Real-time Monitoring & Alerts",
+ description:
+ "Monitor CPU, memory, and network usage in real-time across your deployments for full visibility.",
+ icon: ,
+ },
+ {
+ title: "Built for developers",
+ description:
+ "Designed specifically for engineers and developers seeking control and flexibility.",
+ icon: ,
+ },
+ {
+ title: "Self-hosted & Open Source",
+ description:
+ "Dokploy provides complete control with self-hosting capabilities and open-source transparency.",
+ icon: ,
+ },
+ ];
+ return (
+
+
+ Powerful Deployment, Tailored for You
+
+
+ Unlock seamless multi-server deployments, advanced user control, and
+ flexible database management—all with Dokploy’s developer-focused
+ features.
+
+
+ {features.map((feature, index) => (
+
+ ))}
+
+
+ );
+}
+
+const Feature = ({
+ title,
+ description,
+ icon,
+ index,
+}: {
+ title: string;
+ description: string;
+ icon: React.ReactNode;
+ index: number;
+}) => {
+ return (
+
+ {index < 4 && (
+
+ )}
+ {index >= 4 && (
+
+ )}
+
{icon}
+
+
+ {description}
+
+
+ );
+};
diff --git a/apps/website/components/hero/Hi.tsx b/apps/website/components/hero/Hi.tsx
new file mode 100644
index 0000000..cd70b0c
--- /dev/null
+++ b/apps/website/components/hero/Hi.tsx
@@ -0,0 +1,197 @@
+import { ExternalLink } from "lucide-react";
+
+import { Badge } from "@/components/ui/badge";
+import { cn } from "@/lib/utils";
+import { Button, buttonVariants } from "../ui/button";
+
+const Hero12 = () => {
+ return (
+
+
+
+
+
+
+
+
+ Welcome to Our Website
+
+
+ Elig doloremque mollitia fugiat omnis! Porro facilis quo animi
+ consequatur.
+
+
+
+ {/*
+
+ Try our product for free
+
+
+ No credit card required
+
+
+
+ Book a demo
+ */}
+
+
+
+
+
+
+
+
+
+
+
4.8 starts
+
+
207 Reviews
+
+
+
+
+
+

+
+
+
+ );
+};
+
+export default Hero12;
diff --git a/apps/website/components/ui/accordion.tsx b/apps/website/components/ui/accordion.tsx
new file mode 100644
index 0000000..eb09d85
--- /dev/null
+++ b/apps/website/components/ui/accordion.tsx
@@ -0,0 +1,61 @@
+"use client";
+
+import * as AccordionPrimitive from "@radix-ui/react-accordion";
+import { ChevronDown, Minus, PlusIcon } from "lucide-react";
+import * as React from "react";
+
+import { cn } from "@/lib/utils";
+
+const Accordion = AccordionPrimitive.Root;
+
+const AccordionItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+AccordionItem.displayName = "AccordionItem";
+
+const AccordionTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ svg]:rotate-180 group",
+ className,
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+
+));
+AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
+
+const AccordionContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+ {children}
+
+
+));
+
+AccordionContent.displayName = AccordionPrimitive.Content.displayName;
+
+export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
diff --git a/apps/website/components/ui/animated-gradient-text.tsx b/apps/website/components/ui/animated-gradient-text.tsx
new file mode 100644
index 0000000..e53cd79
--- /dev/null
+++ b/apps/website/components/ui/animated-gradient-text.tsx
@@ -0,0 +1,28 @@
+import type { ReactNode } from "react";
+
+import { cn } from "@/lib/utils";
+
+export default function AnimatedGradientText({
+ children,
+ className,
+}: {
+ children: ReactNode;
+ className?: string;
+}) {
+ return (
+
+ );
+}
diff --git a/apps/website/components/ui/hero-video-dialog.tsx b/apps/website/components/ui/hero-video-dialog.tsx
new file mode 100644
index 0000000..f24a203
--- /dev/null
+++ b/apps/website/components/ui/hero-video-dialog.tsx
@@ -0,0 +1,143 @@
+"use client";
+
+import { AnimatePresence, motion } from "framer-motion";
+import { Play, XIcon } from "lucide-react";
+import { useState } from "react";
+
+import { cn } from "@/lib/utils";
+
+type AnimationStyle =
+ | "from-bottom"
+ | "from-center"
+ | "from-top"
+ | "from-left"
+ | "from-right"
+ | "fade"
+ | "top-in-bottom-out"
+ | "left-in-right-out";
+
+interface HeroVideoProps {
+ animationStyle?: AnimationStyle;
+ videoSrc: string;
+ thumbnailSrc: string;
+ thumbnailAlt?: string;
+ className?: string;
+}
+
+const animationVariants = {
+ "from-bottom": {
+ initial: { y: "100%", opacity: 0 },
+ animate: { y: 0, opacity: 1 },
+ exit: { y: "100%", opacity: 0 },
+ },
+ "from-center": {
+ initial: { scale: 0.5, opacity: 0 },
+ animate: { scale: 1, opacity: 1 },
+ exit: { scale: 0.5, opacity: 0 },
+ },
+ "from-top": {
+ initial: { y: "-100%", opacity: 0 },
+ animate: { y: 0, opacity: 1 },
+ exit: { y: "-100%", opacity: 0 },
+ },
+ "from-left": {
+ initial: { x: "-100%", opacity: 0 },
+ animate: { x: 0, opacity: 1 },
+ exit: { x: "-100%", opacity: 0 },
+ },
+ "from-right": {
+ initial: { x: "100%", opacity: 0 },
+ animate: { x: 0, opacity: 1 },
+ exit: { x: "100%", opacity: 0 },
+ },
+ fade: {
+ initial: { opacity: 0 },
+ animate: { opacity: 1 },
+ exit: { opacity: 0 },
+ },
+ "top-in-bottom-out": {
+ initial: { y: "-100%", opacity: 0 },
+ animate: { y: 0, opacity: 1 },
+ exit: { y: "100%", opacity: 0 },
+ },
+ "left-in-right-out": {
+ initial: { x: "-100%", opacity: 0 },
+ animate: { x: 0, opacity: 1 },
+ exit: { x: "100%", opacity: 0 },
+ },
+};
+
+export default function HeroVideoDialog({
+ animationStyle = "from-center",
+ videoSrc,
+ thumbnailSrc,
+ thumbnailAlt = "Video thumbnail",
+ className,
+}: HeroVideoProps) {
+ const [isVideoOpen, setIsVideoOpen] = useState(false);
+ const selectedAnimation = animationVariants[animationStyle];
+
+ return (
+
+
setIsVideoOpen(true)}
+ >
+

+
+
+
+ {isVideoOpen && (
+ setIsVideoOpen(false)}
+ exit={{ opacity: 0 }}
+ className="fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-md"
+ >
+
+
+
+
+
+ {/* biome-ignore lint/a11y/useIframeTitle: */}
+
+
+
+
+ )}
+
+
+ );
+}
diff --git a/apps/website/components/ui/marquee.tsx b/apps/website/components/ui/marquee.tsx
new file mode 100644
index 0000000..a7fddcc
--- /dev/null
+++ b/apps/website/components/ui/marquee.tsx
@@ -0,0 +1,51 @@
+import { cn } from "@/lib/utils";
+
+interface MarqueeProps {
+ className?: string;
+ reverse?: boolean;
+ pauseOnHover?: boolean;
+ children?: React.ReactNode;
+ vertical?: boolean;
+ repeat?: number;
+ [key: string]: any;
+}
+
+export function Marquee({
+ className,
+ reverse,
+ pauseOnHover = false,
+ children,
+ vertical = false,
+ repeat = 4,
+ ...props
+}: MarqueeProps) {
+ return (
+
+ {Array(repeat)
+ .fill(0)
+ .map((_, i) => (
+
+ {children}
+
+ ))}
+
+ );
+}
diff --git a/apps/website/components/ui/safari.tsx b/apps/website/components/ui/safari.tsx
new file mode 100644
index 0000000..56a37b4
--- /dev/null
+++ b/apps/website/components/ui/safari.tsx
@@ -0,0 +1,138 @@
+import type { SVGProps } from "react";
+
+export interface SafariProps extends SVGProps {
+ url?: string;
+ src?: string;
+ width?: number;
+ height?: number;
+}
+
+export default function Safari({
+ src,
+ url,
+ width = 1203,
+ height = 753,
+ ...props
+}: SafariProps) {
+ return (
+
+ );
+}
diff --git a/apps/website/locales/en.json b/apps/website/locales/en.json
index bd69927..6751edb 100644
--- a/apps/website/locales/en.json
+++ b/apps/website/locales/en.json
@@ -39,14 +39,16 @@
"projectsDes": "Manage and organize all your projects in one place, keeping detailed track of progress and resource allocation.",
"applications": "Applications & Databases",
"applicationsDes": "Centralize control over your applications and databases for enhanced security and efficiency, simplifying access and management across your infrastructure.",
- "compose": "Compose",
+ "compose": "Docker Compose",
"composeDes": "Native Docker Compose support for manage complex applications and services with ease.",
- "multinode": "Multinode",
- "multinodeDes": "Scale applications to multiples nodes using docker swarm to manage the cluster.",
+ "multiserver": "Multiserver",
+ "multiserverDes": "Deploy applications to multiple servers without effort.",
"monitoring": "Monitoring",
"monitoringDes": "Monitor your systems' performance and health in real time, ensuring continuous and uninterrupted operation.",
"backups": "Backups",
- "backupsDes": "Implement automatic and secure backup solutions to protect your critical data and restore it quickly when necessary."
+ "backupsDes": "Implement automatic and secure backup solutions to protect your critical data and restore it quickly when necessary.",
+ "traefik": "Traefik",
+ "traefikDes": "Manage traefik via File Editor to configure your own domain names, certificates, and more."
},
"secondaryFeatures": {
"title": "Advanced Management Tools",
@@ -65,8 +67,8 @@
"terminalDes": "Provides an interface to access the command line of any active container, allowing developers to execute commands, manage services, and troubleshoot directly from the dashboard"
},
"callToAction": {
- "title": "Unlock Your Deployment Potential",
- "des": "Streamline your deployments with our PaaS. Effortlessly manage Docker containers and traffic with Traefik. Boost your infrastructure's efficiency and security today",
+ "title": "Unlock Your Deployment Potential with Dokploy Cloud",
+ "des": "Say goodbye to infrastructure hassles—Dokploy Cloud handles it all. Effortlessly deploy, manage Docker containers, and secure your traffic with Traefik. Focus on building, we’ll handle the rest.",
"button": "Get Started Now"
},
"faq": {
@@ -76,22 +78,20 @@
"a1": "Dokploy is a stable, easy-to-use deployment solution designed to simplify the application management process. Think of Dokploy as a free alternative self-hostable solution to platforms like Heroku, Vercel, and Netlify.",
"q2": "Why Choose Dokploy?",
"a2": "Dokploy offers simplicity, flexibility, and speed in application deployment and management.",
- "q3": "Is Dokploy free?",
- "a3": "Yes, Dokploy is totally free. You can use it for personal projects, small teams, or even for large-scale applications.",
"q4": "Is it open source?",
"a4": "Yes, Dokploy is open source and free to use.",
"q5": "What types of languages can I deploy with Dokploy?",
"a5": "Dokploy does not restrict programming languages. You are free to choose your preferred language and framework.",
"q6": "How do I request a feature or report a bug?",
- "a6": "To request a feature or report a bug, please create an issue on our GitHub repository or ask in our Discord channel. We are currently focused on addressing existing bugs and plan to release new features soon.",
+ "a6": "To request a feature or report a bug, please create an issue on our GitHub repository or ask in our Discord channel.",
"q7": "Do you track the usage of Dokploy?",
"a7": "No, we don't track any usage data.",
"q8": "Are there any user forums or communities where I can interact with other users?",
- "a8": "Yes, we have active GitHub discussions where you can share ideas, ask for help, and connect with other users.",
+ "a8": "Yes, we have active GitHub discussions and Discord where you can share ideas, ask for help, and connect with other users.",
"q9": "What types of applications can I deploy with Dokploy?",
- "a9": "Dokploy supports a variety of applications, including those built with Docker, as well as applications from any Git repository, offering custom builds with Nixpacks, Dockerfiles, or Buildpacks like Heroku and Paketo.",
+ "a9": "You can deploy any application that can be Dockerized, with no limits. Dokploy supports builds from Git repositories, Dockerfiles, Nixpacks, and Buildpacks like Heroku and Paketo.",
"q10": "How does Dokploy handle database management?",
- "a10": "Dokploy supports multiple database systems including Postgres, MySQL, MariaDB, MongoDB, and Redis, providing tools for easy deployment and management directly from the dashboard."
+ "a10": "Dokploy supports multiple database systems including Postgres, MySQL, MariaDB, MongoDB, and Redis, providing tools for easy deployment and management and backups directly from the dashboard."
},
"footer": {
"copyright": "Copyright © {year} Dokploy. All rights reserved."
diff --git a/apps/website/package.json b/apps/website/package.json
index 44cfe62..deebed1 100644
--- a/apps/website/package.json
+++ b/apps/website/package.json
@@ -14,14 +14,17 @@
"dependencies": {
"@headlessui/react": "^1.7.17",
"@headlessui/tailwindcss": "^0.2.0",
+ "@radix-ui/react-accordion": "^1.2.1",
"@radix-ui/react-select": "^2.0.0",
"@radix-ui/react-slot": "^1.0.2",
"@radix-ui/react-switch": "^1.0.3",
+ "@radix-ui/react-tabs": "1.1.1",
+ "@tabler/icons-react": "3.21.0",
"@types/node": "20.4.6",
"autoprefixer": "^10.4.12",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.0",
- "framer-motion": "^11.0.24",
+ "framer-motion": "^11.3.19",
"lucide-react": "0.364.0",
"next": "14.2.2",
"next-intl": "^3.19.0",
@@ -31,8 +34,7 @@
"tailwind-merge": "^2.2.2",
"tailwindcss": "^3.4.1",
"tailwindcss-animate": "^1.0.7",
- "typescript": "5.1.6",
- "@radix-ui/react-tabs": "1.1.1"
+ "typescript": "5.1.6"
},
"devDependencies": {
"@biomejs/biome": "1.7.0",
diff --git a/apps/website/public/primary/applications.png b/apps/website/public/primary/applications.png
deleted file mode 100644
index 4ea3233..0000000
Binary files a/apps/website/public/primary/applications.png and /dev/null differ
diff --git a/apps/website/public/primary/backups.png b/apps/website/public/primary/backups.png
index 4629431..42856e6 100644
Binary files a/apps/website/public/primary/backups.png and b/apps/website/public/primary/backups.png differ
diff --git a/apps/website/public/primary/compose.png b/apps/website/public/primary/compose.png
index 149cdc0..af28db1 100644
Binary files a/apps/website/public/primary/compose.png and b/apps/website/public/primary/compose.png differ
diff --git a/apps/website/public/primary/monitoring.png b/apps/website/public/primary/monitoring.png
index 7cde908..64c3537 100644
Binary files a/apps/website/public/primary/monitoring.png and b/apps/website/public/primary/monitoring.png differ
diff --git a/apps/website/public/primary/primary.png b/apps/website/public/primary/primary.png
new file mode 100644
index 0000000..1addd95
Binary files /dev/null and b/apps/website/public/primary/primary.png differ
diff --git a/apps/website/public/primary/servers.png b/apps/website/public/primary/servers.png
new file mode 100644
index 0000000..fa89c93
Binary files /dev/null and b/apps/website/public/primary/servers.png differ
diff --git a/apps/website/public/primary/traefik.png b/apps/website/public/primary/traefik.png
new file mode 100644
index 0000000..d0d0ad5
Binary files /dev/null and b/apps/website/public/primary/traefik.png differ
diff --git a/apps/website/tailwind.config.ts b/apps/website/tailwind.config.ts
index a177e37..13e3362 100644
--- a/apps/website/tailwind.config.ts
+++ b/apps/website/tailwind.config.ts
@@ -26,7 +26,7 @@ const config = {
"9xl": ["8rem", { lineHeight: "1" }],
},
container: {
- center: true,
+ center: "true",
padding: "2rem",
screens: {
"2xl": "1400px",
@@ -79,6 +79,22 @@ const config = {
display: "var(--font-lexend)",
},
keyframes: {
+ marquee: {
+ from: {
+ transform: "translateX(0)",
+ },
+ to: {
+ transform: "translateX(calc(-100% - var(--gap)))",
+ },
+ },
+ "marquee-vertical": {
+ from: {
+ transform: "translateY(0)",
+ },
+ to: {
+ transform: "translateY(calc(-100% - var(--gap)))",
+ },
+ },
"accordion-down": {
from: {
height: "0",
@@ -103,11 +119,19 @@ const config = {
"background-position": "calc(100% + var(--shiny-width)) 0",
},
},
+ gradient: {
+ to: {
+ backgroundPosition: "var(--bg-size) 0",
+ },
+ },
},
animation: {
"accordion-down": "accordion-down 0.2s ease-out",
"accordion-up": "accordion-up 0.2s ease-out",
"shiny-text": "shiny-text 8s infinite",
+ marquee: "marquee var(--duration) linear infinite",
+ "marquee-vertical": "marquee-vertical var(--duration) linear infinite",
+ gradient: "gradient 8s linear infinite",
},
},
},
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 8d3f780..b7e9334 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -88,6 +88,9 @@ importers:
'@headlessui/tailwindcss':
specifier: ^0.2.0
version: 0.2.1(tailwindcss@3.4.7)
+ '@radix-ui/react-accordion':
+ specifier: ^1.2.1
+ version: 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-select':
specifier: ^2.0.0
version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
@@ -100,6 +103,9 @@ importers:
'@radix-ui/react-tabs':
specifier: 1.1.1
version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@tabler/icons-react':
+ specifier: 3.21.0
+ version: 3.21.0(react@18.2.0)
'@types/node':
specifier: 20.4.6
version: 20.4.6
@@ -113,7 +119,7 @@ importers:
specifier: ^2.1.0
version: 2.1.1
framer-motion:
- specifier: ^11.0.24
+ specifier: ^11.3.19
version: 11.3.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
lucide-react:
specifier: 0.364.0
@@ -586,6 +592,19 @@ packages:
'@types/react-dom':
optional: true
+ '@radix-ui/react-accordion@1.2.1':
+ resolution: {integrity: sha512-bg/l7l5QzUjgsh8kjwDFommzAshnUsuVMV5NM56QVCm+7ZckYdd9P/ExR8xG/Oup0OajVxNLaHJ1tb8mXk+nzQ==}
+ peerDependencies:
+ '@types/react': 18.3.5
+ '@types/react-dom': 18.3.0
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
'@radix-ui/react-arrow@1.1.0':
resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==}
peerDependencies:
@@ -612,6 +631,19 @@ packages:
'@types/react-dom':
optional: true
+ '@radix-ui/react-collapsible@1.1.1':
+ resolution: {integrity: sha512-1///SnrfQHJEofLokyczERxQbWfCGQlQ2XsCZMucVs6it+lq9iw4vXy+uDn1edlb58cOZOWSldnfPAYcT4O/Yg==}
+ peerDependencies:
+ '@types/react': 18.3.5
+ '@types/react-dom': 18.3.0
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
'@radix-ui/react-collection@1.1.0':
resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==}
peerDependencies:
@@ -1136,6 +1168,14 @@ packages:
'@swc/helpers@0.5.5':
resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==}
+ '@tabler/icons-react@3.21.0':
+ resolution: {integrity: sha512-Qq0GnZzzccbv/zuMyXAUUPlogNAqx9KsF8cr/ev3bxs+GMObqNEjXv1eZl9GFzxyQTS435siJNU8A1BaIYhX8g==}
+ peerDependencies:
+ react: '>= 16'
+
+ '@tabler/icons@3.21.0':
+ resolution: {integrity: sha512-5+GkkmWCr1wgMor5cOF1/YYflTQdc15y10FUikJ3HW8hDiFjfbuoAHJi17FT1vwsr1sA78rkJMn+fDoOOjnnPA==}
+
'@tailwindcss/typography@0.5.13':
resolution: {integrity: sha512-ADGcJ8dX21dVVHIwTRgzrcunY6YY9uSlAHHGVKvkA+vLc5qLwEszvKts40lx7z0qc4clpjclwLeK5rVCV2P/uw==}
peerDependencies:
@@ -3386,6 +3426,23 @@ snapshots:
'@types/react': 18.3.5
'@types/react-dom': 18.3.0
+ '@radix-ui/react-accordion@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-collapsible': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.2.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@18.3.5)(react@18.2.0)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.5)(react@18.2.0)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.2.0)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ optionalDependencies:
+ '@types/react': 18.3.5
+ '@types/react-dom': 18.3.0
+
'@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
@@ -3420,6 +3477,22 @@ snapshots:
'@types/react': 18.3.5
'@types/react-dom': 18.3.0
+ '@radix-ui/react-collapsible@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.2.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@18.3.5)(react@18.2.0)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.2.0)
+ '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ optionalDependencies:
+ '@types/react': 18.3.5
+ '@types/react-dom': 18.3.0
+
'@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.2.0)
@@ -4108,6 +4181,13 @@ snapshots:
'@swc/counter': 0.1.3
tslib: 2.6.3
+ '@tabler/icons-react@3.21.0(react@18.2.0)':
+ dependencies:
+ '@tabler/icons': 3.21.0
+ react: 18.2.0
+
+ '@tabler/icons@3.21.0': {}
+
'@tailwindcss/typography@0.5.13(tailwindcss@3.4.7)':
dependencies:
lodash.castarray: 4.4.0