diff --git a/.circleci/config.yml b/.circleci/config.yml
index c5e57a973..25982d59b 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -99,14 +99,14 @@ workflows:
only:
- main
- canary
- - fix/build-i18n
+ - refactor/enhancement-languages
- build-arm64:
filters:
branches:
only:
- main
- canary
- - fix/build-i18n
+ - refactor/enhancement-languages
- combine-manifests:
requires:
- build-amd64
@@ -116,4 +116,4 @@ workflows:
only:
- main
- canary
- - fix/build-i18n
+ - refactor/enhancement-languages
diff --git a/Dockerfile b/Dockerfile
index 838fbe4f6..ebc61a2b7 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -35,7 +35,7 @@ RUN apt-get update && apt-get install -y curl unzip apache2-utils && rm -rf /var
COPY --from=build /prod/dokploy/.next ./.next
COPY --from=build /prod/dokploy/dist ./dist
COPY --from=build /prod/dokploy/next.config.mjs ./next.config.mjs
-COPY --from=build /prod/dokploy/next-i18next.config.cjs ./next-i18next.config.cjs
+# COPY --from=build /prod/dokploy/next-i18next.config.cjs ./next-i18next.config.cjs
COPY --from=build /prod/dokploy/public ./public
COPY --from=build /prod/dokploy/package.json ./package.json
COPY --from=build /prod/dokploy/drizzle ./drizzle
diff --git a/apps/dokploy/__test__/drop/drop.test.test.ts b/apps/dokploy/__test__/drop/drop.test.test.ts
index 53ab02f2b..9a6473afd 100644
--- a/apps/dokploy/__test__/drop/drop.test.test.ts
+++ b/apps/dokploy/__test__/drop/drop.test.test.ts
@@ -26,6 +26,7 @@ if (typeof window === "undefined") {
const baseApp: ApplicationNested = {
applicationId: "",
+ herokuVersion: "",
applicationStatus: "done",
appName: "",
autoDeploy: true,
diff --git a/apps/dokploy/__test__/traefik/traefik.test.ts b/apps/dokploy/__test__/traefik/traefik.test.ts
index 7e11160bd..d7ad29ab0 100644
--- a/apps/dokploy/__test__/traefik/traefik.test.ts
+++ b/apps/dokploy/__test__/traefik/traefik.test.ts
@@ -6,6 +6,7 @@ import { expect, test } from "vitest";
const baseApp: ApplicationNested = {
applicationId: "",
+ herokuVersion: "",
applicationStatus: "done",
appName: "",
autoDeploy: true,
diff --git a/apps/dokploy/components/dashboard/compose/general/actions.tsx b/apps/dokploy/components/dashboard/compose/general/actions.tsx
index 0fa5ae38e..439669669 100644
--- a/apps/dokploy/components/dashboard/compose/general/actions.tsx
+++ b/apps/dokploy/components/dashboard/compose/general/actions.tsx
@@ -68,7 +68,7 @@ export const ComposeActions = ({ composeId }: Props) => {
Open Terminal
-
+
Autodeploy
import("./docker-terminal").then((e) => e.DockerTerminal),
- {
- ssr: false,
- }
+ () => import("./docker-terminal").then((e) => e.DockerTerminal),
+ {
+ ssr: false,
+ },
);
interface Props {
- containerId: string;
- serverId?: string;
- children?: React.ReactNode;
+ containerId: string;
+ serverId?: string;
+ children?: React.ReactNode;
}
export const DockerTerminalModal = ({
- children,
- containerId,
- serverId,
+ children,
+ containerId,
+ serverId,
}: Props) => {
- const [mainDialogOpen, setMainDialogOpen] = useState(false);
- const [confirmDialogOpen, setConfirmDialogOpen] = useState(false);
+ const [mainDialogOpen, setMainDialogOpen] = useState(false);
+ const [confirmDialogOpen, setConfirmDialogOpen] = useState(false);
- const handleMainDialogOpenChange = (open: boolean) => {
- if (!open) {
- setConfirmDialogOpen(true);
- } else {
- setMainDialogOpen(true);
- }
- };
+ const handleMainDialogOpenChange = (open: boolean) => {
+ if (!open) {
+ setConfirmDialogOpen(true);
+ } else {
+ setMainDialogOpen(true);
+ }
+ };
- const handleConfirm = () => {
- setConfirmDialogOpen(false);
- setMainDialogOpen(false);
- };
+ const handleConfirm = () => {
+ setConfirmDialogOpen(false);
+ setMainDialogOpen(false);
+ };
- const handleCancel = () => {
- setConfirmDialogOpen(false);
- };
- return (
-
+ );
};
diff --git a/apps/dokploy/components/dashboard/settings/appearance-form.tsx b/apps/dokploy/components/dashboard/settings/appearance-form.tsx
index 9f740efd8..d5b90182d 100644
--- a/apps/dokploy/components/dashboard/settings/appearance-form.tsx
+++ b/apps/dokploy/components/dashboard/settings/appearance-form.tsx
@@ -27,6 +27,7 @@ import {
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
+import { Languages } from "@/lib/languages";
import useLocale from "@/utils/hooks/use-locale";
import { useTranslation } from "next-i18next";
import { useTheme } from "next-themes";
@@ -37,25 +38,9 @@ const appearanceFormSchema = z.object({
theme: z.enum(["light", "dark", "system"], {
required_error: "Please select a theme.",
}),
- language: z.enum(
- [
- "en",
- "pl",
- "ru",
- "fr",
- "de",
- "tr",
- "zh-Hant",
- "kz",
- "zh-Hans",
- "fa",
- "ko",
- "pt-br",
- ],
- {
- required_error: "Please select a language.",
- },
- ),
+ language: z.nativeEnum(Languages, {
+ required_error: "Please select a language.",
+ }),
});
type AppearanceFormValues = z.infer;
@@ -63,7 +48,7 @@ type AppearanceFormValues = z.infer;
// This can come from your database or API.
const defaultValues: Partial = {
theme: "system",
- language: "en",
+ language: Languages.English,
};
export function AppearanceForm() {
@@ -188,25 +173,15 @@ export function AppearanceForm() {
- {[
- { label: "English", value: "en" },
- { label: "Polski", value: "pl" },
- { label: "Русский", value: "ru" },
- { label: "Français", value: "fr" },
- { label: "Deutsch", value: "de" },
- { label: "繁體中文", value: "zh-Hant" },
- { label: "简体中文", value: "zh-Hans" },
- { label: "Türkçe", value: "tr" },
- { label: "Қазақ", value: "tr" },
- { label: "Kazakh", value: "kz" },
- { label: "Persian", value: "fa" },
- { label: "한국어", value: "ko" },
- { label: "Português", value: "pt-br" },
- ].map((preset) => (
-
- {preset.label}
-
- ))}
+ {Object.keys(Languages).map((preset) => {
+ const value =
+ Languages[preset as keyof typeof Languages];
+ return (
+
+ {preset}
+
+ );
+ })}
diff --git a/apps/dokploy/components/dashboard/settings/web-server/docker-terminal-modal.tsx b/apps/dokploy/components/dashboard/settings/web-server/docker-terminal-modal.tsx
index ba3253a4a..f81be0adf 100644
--- a/apps/dokploy/components/dashboard/settings/web-server/docker-terminal-modal.tsx
+++ b/apps/dokploy/components/dashboard/settings/web-server/docker-terminal-modal.tsx
@@ -1,22 +1,22 @@
import { Button } from "@/components/ui/button";
import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogFooter,
- DialogHeader,
- DialogTitle,
- DialogTrigger,
+ Dialog,
+ DialogContent,
+ DialogDescription,
+ DialogFooter,
+ DialogHeader,
+ DialogTitle,
+ DialogTrigger,
} from "@/components/ui/dialog";
import { Label } from "@/components/ui/label";
import {
- Select,
- SelectContent,
- SelectGroup,
- SelectItem,
- SelectLabel,
- SelectTrigger,
- SelectValue,
+ Select,
+ SelectContent,
+ SelectGroup,
+ SelectItem,
+ SelectLabel,
+ SelectTrigger,
+ SelectValue,
} from "@/components/ui/select";
import { api } from "@/utils/api";
import { Loader2 } from "lucide-react";
@@ -25,118 +25,118 @@ import type React from "react";
import { useEffect, useState } from "react";
const Terminal = dynamic(
- () =>
- import("@/components/dashboard/docker/terminal/docker-terminal").then(
- (e) => e.DockerTerminal
- ),
- {
- ssr: false,
- }
+ () =>
+ import("@/components/dashboard/docker/terminal/docker-terminal").then(
+ (e) => e.DockerTerminal,
+ ),
+ {
+ ssr: false,
+ },
);
interface Props {
- appName: string;
- children?: React.ReactNode;
- serverId?: string;
+ appName: string;
+ children?: React.ReactNode;
+ serverId?: string;
}
export const DockerTerminalModal = ({ children, appName, serverId }: Props) => {
- const { data, isLoading } = api.docker.getContainersByAppNameMatch.useQuery(
- {
- appName,
- serverId,
- },
- {
- enabled: !!appName,
- }
- );
- const [containerId, setContainerId] = useState();
- const [mainDialogOpen, setMainDialogOpen] = useState(false);
- const [confirmDialogOpen, setConfirmDialogOpen] = useState(false);
+ const { data, isLoading } = api.docker.getContainersByAppNameMatch.useQuery(
+ {
+ appName,
+ serverId,
+ },
+ {
+ enabled: !!appName,
+ },
+ );
+ const [containerId, setContainerId] = useState();
+ const [mainDialogOpen, setMainDialogOpen] = useState(false);
+ const [confirmDialogOpen, setConfirmDialogOpen] = useState(false);
- const handleMainDialogOpenChange = (open: boolean) => {
- if (!open) {
- setConfirmDialogOpen(true);
- } else {
- setMainDialogOpen(true);
- }
- };
+ const handleMainDialogOpenChange = (open: boolean) => {
+ if (!open) {
+ setConfirmDialogOpen(true);
+ } else {
+ setMainDialogOpen(true);
+ }
+ };
- const handleConfirm = () => {
- setConfirmDialogOpen(false);
- setMainDialogOpen(false);
- };
+ const handleConfirm = () => {
+ setConfirmDialogOpen(false);
+ setMainDialogOpen(false);
+ };
- const handleCancel = () => {
- setConfirmDialogOpen(false);
- };
+ const handleCancel = () => {
+ setConfirmDialogOpen(false);
+ };
- useEffect(() => {
- if (data && data?.length > 0) {
- setContainerId(data[0]?.containerId);
- }
- }, [data]);
+ useEffect(() => {
+ if (data && data?.length > 0) {
+ setContainerId(data[0]?.containerId);
+ }
+ }, [data]);
- return (
-
- {children}
-
-
- Docker Terminal
-
- Easy way to access to docker container
-
-
-
-
-
-
-
-
-
- Are you sure you want to close the terminal?
-
-
- By clicking the confirm button, the terminal will be closed.
-
-
-
-
-
-
-
-
-
-
- );
+ return (
+
+ {children}
+
+
+ Docker Terminal
+
+ Easy way to access to docker container
+
+
+
+
+
+
+
+
+
+ Are you sure you want to close the terminal?
+
+
+ By clicking the confirm button, the terminal will be closed.
+
+
+
+
+
+
+
+
+
+
+ );
};
diff --git a/apps/dokploy/lib/languages.ts b/apps/dokploy/lib/languages.ts
new file mode 100644
index 000000000..59bcc097d
--- /dev/null
+++ b/apps/dokploy/lib/languages.ts
@@ -0,0 +1,16 @@
+export enum Languages {
+ English = "en",
+ Polish = "pl",
+ Russian = "ru",
+ French = "fr",
+ German = "de",
+ ChineseTraditional = "zh-Hant",
+ ChineseSimplified = "zh-Hans",
+ Turkish = "tr",
+ Kazakh = "kz",
+ Persian = "fa",
+ Korean = "ko",
+ Portuguese = "pt-br",
+}
+
+export type Language = keyof typeof Languages;
diff --git a/apps/dokploy/next-i18next.config.cjs b/apps/dokploy/next-i18next.config.cjs
index fef1df4a2..9f030ecb2 100644
--- a/apps/dokploy/next-i18next.config.cjs
+++ b/apps/dokploy/next-i18next.config.cjs
@@ -1,23 +1,23 @@
/** @type {import('next-i18next').UserConfig} */
module.exports = {
- fallbackLng: "en",
- keySeparator: false,
- i18n: {
- defaultLocale: "en",
- locales: [
- "en",
- "pl",
- "ru",
- "fr",
- "de",
- "tr",
- "kz",
- "zh-Hant",
- "zh-Hans",
- "fa",
- "ko",
- "pt-br",
- ],
- localeDetection: false,
- },
+ fallbackLng: "en",
+ keySeparator: false,
+ i18n: {
+ defaultLocale: "en",
+ locales: [
+ "en",
+ "pl",
+ "ru",
+ "fr",
+ "de",
+ "tr",
+ "kz",
+ "zh-Hant",
+ "zh-Hans",
+ "fa",
+ "ko",
+ "pt-br",
+ ],
+ localeDetection: false,
+ },
};
diff --git a/apps/dokploy/pages/_app.tsx b/apps/dokploy/pages/_app.tsx
index 511ac93ba..e7c0befc3 100644
--- a/apps/dokploy/pages/_app.tsx
+++ b/apps/dokploy/pages/_app.tsx
@@ -1,6 +1,7 @@
import "@/styles/globals.css";
import { Toaster } from "@/components/ui/sonner";
+import { Languages } from "@/lib/languages";
import { api } from "@/utils/api";
import type { NextPage } from "next";
import { appWithTranslation } from "next-i18next";
@@ -71,20 +72,7 @@ export default api.withTRPC(
{
i18n: {
defaultLocale: "en",
- locales: [
- "en",
- "pl",
- "ru",
- "fr",
- "de",
- "tr",
- "kz",
- "zh-Hant",
- "zh-Hans",
- "fa",
- "ko",
- "pt-br",
- ],
+ locales: Object.values(Languages),
localeDetection: false,
},
fallbackLng: "en",
diff --git a/apps/dokploy/pages/api/deploy/github.ts b/apps/dokploy/pages/api/deploy/github.ts
index 7f0e7f0b0..e5ed154f8 100644
--- a/apps/dokploy/pages/api/deploy/github.ts
+++ b/apps/dokploy/pages/api/deploy/github.ts
@@ -10,142 +10,141 @@ import type { NextApiRequest, NextApiResponse } from "next";
import { extractCommitMessage, extractHash } from "./[refreshToken]";
export default async function handler(
- req: NextApiRequest,
- res: NextApiResponse
+ req: NextApiRequest,
+ res: NextApiResponse,
) {
- const signature = req.headers["x-hub-signature-256"];
- const githubBody = req.body;
-
- if (!githubBody?.installation?.id) {
- res.status(400).json({ message: "Github Installation not found" });
- return;
- }
-
- const githubResult = await db.query.github.findFirst({
- where: eq(github.githubInstallationId, githubBody.installation.id),
- });
-
- if (!githubResult) {
- res.status(400).json({ message: "Github Installation not found" });
- return;
- }
-
- if (!githubResult.githubWebhookSecret) {
- res.status(400).json({ message: "Github Webhook Secret not set" });
- return;
- }
- const webhooks = new Webhooks({
- secret: githubResult.githubWebhookSecret,
- });
-
- const verified = await webhooks.verify(
- JSON.stringify(githubBody),
- signature as string
- );
-
- if (!verified) {
- res.status(401).json({ message: "Unauthorized" });
- return;
- }
-
- if (req.headers["x-github-event"] === "ping") {
- res.status(200).json({ message: "Ping received, webhook is active" });
- return;
- }
-
- if (req.headers["x-github-event"] !== "push") {
- res.status(400).json({ message: "We only accept push events" });
- return;
- }
-
- try {
- const branchName = githubBody?.ref?.replace("refs/heads/", "");
- const repository = githubBody?.repository?.name;
- const deploymentTitle = extractCommitMessage(req.headers, req.body);
- const deploymentHash = extractHash(req.headers, req.body);
- const owner = githubBody?.repository?.owner?.name;
-
-
- const apps = await db.query.applications.findMany({
- where: and(
- eq(applications.sourceType, "github"),
- eq(applications.autoDeploy, true),
- eq(applications.branch, branchName),
- eq(applications.repository, repository),
- eq(applications.owner, owner)
- ),
- });
-
- for (const app of apps) {
- const jobData: DeploymentJob = {
- applicationId: app.applicationId as string,
- titleLog: deploymentTitle,
- descriptionLog: `Hash: ${deploymentHash}`,
- type: "deploy",
- applicationType: "application",
- server: !!app.serverId,
- };
-
- if (IS_CLOUD && app.serverId) {
- jobData.serverId = app.serverId;
- await deploy(jobData);
- return true;
- }
- await myQueue.add(
- "deployments",
- { ...jobData },
- {
- removeOnComplete: true,
- removeOnFail: true,
- }
- );
- }
-
- const composeApps = await db.query.compose.findMany({
- where: and(
- eq(compose.sourceType, "github"),
- eq(compose.autoDeploy, true),
- eq(compose.branch, branchName),
- eq(compose.repository, repository),
- eq(compose.owner, owner)
- ),
- });
-
- for (const composeApp of composeApps) {
- const jobData: DeploymentJob = {
- composeId: composeApp.composeId as string,
- titleLog: deploymentTitle,
- type: "deploy",
- applicationType: "compose",
- descriptionLog: `Hash: ${deploymentHash}`,
- server: !!composeApp.serverId,
- };
-
- if (IS_CLOUD && composeApp.serverId) {
- jobData.serverId = composeApp.serverId;
- await deploy(jobData);
- return true;
- }
-
- await myQueue.add(
- "deployments",
- { ...jobData },
- {
- removeOnComplete: true,
- removeOnFail: true,
- }
- );
- }
-
- const totalApps = apps.length + composeApps.length;
- const emptyApps = totalApps === 0;
-
- if (emptyApps) {
- res.status(200).json({ message: "No apps to deploy" });
- return;
- }
- res.status(200).json({ message: `Deployed ${totalApps} apps` });
- } catch (error) {
- res.status(400).json({ message: "Error To Deploy Application", error });
- }
+ const signature = req.headers["x-hub-signature-256"];
+ const githubBody = req.body;
+
+ if (!githubBody?.installation?.id) {
+ res.status(400).json({ message: "Github Installation not found" });
+ return;
+ }
+
+ const githubResult = await db.query.github.findFirst({
+ where: eq(github.githubInstallationId, githubBody.installation.id),
+ });
+
+ if (!githubResult) {
+ res.status(400).json({ message: "Github Installation not found" });
+ return;
+ }
+
+ if (!githubResult.githubWebhookSecret) {
+ res.status(400).json({ message: "Github Webhook Secret not set" });
+ return;
+ }
+ const webhooks = new Webhooks({
+ secret: githubResult.githubWebhookSecret,
+ });
+
+ const verified = await webhooks.verify(
+ JSON.stringify(githubBody),
+ signature as string,
+ );
+
+ if (!verified) {
+ res.status(401).json({ message: "Unauthorized" });
+ return;
+ }
+
+ if (req.headers["x-github-event"] === "ping") {
+ res.status(200).json({ message: "Ping received, webhook is active" });
+ return;
+ }
+
+ if (req.headers["x-github-event"] !== "push") {
+ res.status(400).json({ message: "We only accept push events" });
+ return;
+ }
+
+ try {
+ const branchName = githubBody?.ref?.replace("refs/heads/", "");
+ const repository = githubBody?.repository?.name;
+ const deploymentTitle = extractCommitMessage(req.headers, req.body);
+ const deploymentHash = extractHash(req.headers, req.body);
+ const owner = githubBody?.repository?.owner?.name;
+
+ const apps = await db.query.applications.findMany({
+ where: and(
+ eq(applications.sourceType, "github"),
+ eq(applications.autoDeploy, true),
+ eq(applications.branch, branchName),
+ eq(applications.repository, repository),
+ eq(applications.owner, owner),
+ ),
+ });
+
+ for (const app of apps) {
+ const jobData: DeploymentJob = {
+ applicationId: app.applicationId as string,
+ titleLog: deploymentTitle,
+ descriptionLog: `Hash: ${deploymentHash}`,
+ type: "deploy",
+ applicationType: "application",
+ server: !!app.serverId,
+ };
+
+ if (IS_CLOUD && app.serverId) {
+ jobData.serverId = app.serverId;
+ await deploy(jobData);
+ return true;
+ }
+ await myQueue.add(
+ "deployments",
+ { ...jobData },
+ {
+ removeOnComplete: true,
+ removeOnFail: true,
+ },
+ );
+ }
+
+ const composeApps = await db.query.compose.findMany({
+ where: and(
+ eq(compose.sourceType, "github"),
+ eq(compose.autoDeploy, true),
+ eq(compose.branch, branchName),
+ eq(compose.repository, repository),
+ eq(compose.owner, owner),
+ ),
+ });
+
+ for (const composeApp of composeApps) {
+ const jobData: DeploymentJob = {
+ composeId: composeApp.composeId as string,
+ titleLog: deploymentTitle,
+ type: "deploy",
+ applicationType: "compose",
+ descriptionLog: `Hash: ${deploymentHash}`,
+ server: !!composeApp.serverId,
+ };
+
+ if (IS_CLOUD && composeApp.serverId) {
+ jobData.serverId = composeApp.serverId;
+ await deploy(jobData);
+ return true;
+ }
+
+ await myQueue.add(
+ "deployments",
+ { ...jobData },
+ {
+ removeOnComplete: true,
+ removeOnFail: true,
+ },
+ );
+ }
+
+ const totalApps = apps.length + composeApps.length;
+ const emptyApps = totalApps === 0;
+
+ if (emptyApps) {
+ res.status(200).json({ message: "No apps to deploy" });
+ return;
+ }
+ res.status(200).json({ message: `Deployed ${totalApps} apps` });
+ } catch (error) {
+ res.status(400).json({ message: "Error To Deploy Application", error });
+ }
}
diff --git a/apps/dokploy/public/locales/ko/settings.json b/apps/dokploy/public/locales/ko/settings.json
index f0a99e4e7..db877ee6a 100644
--- a/apps/dokploy/public/locales/ko/settings.json
+++ b/apps/dokploy/public/locales/ko/settings.json
@@ -1,44 +1,44 @@
{
- "settings.common.save": "저장",
- "settings.server.domain.title": "서버 도메인",
- "settings.server.domain.description": "서버 애플리케이션에 도메인을 추가합니다.",
- "settings.server.domain.form.domain": "도메인",
- "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt 이메일",
- "settings.server.domain.form.certificate.label": "인증서",
- "settings.server.domain.form.certificate.placeholder": "인증서 선택",
- "settings.server.domain.form.certificateOptions.none": "없음",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (기본)",
+ "settings.common.save": "저장",
+ "settings.server.domain.title": "서버 도메인",
+ "settings.server.domain.description": "서버 애플리케이션에 도메인을 추가합니다.",
+ "settings.server.domain.form.domain": "도메인",
+ "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt 이메일",
+ "settings.server.domain.form.certificate.label": "인증서",
+ "settings.server.domain.form.certificate.placeholder": "인증서 선택",
+ "settings.server.domain.form.certificateOptions.none": "없음",
+ "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (기본)",
- "settings.server.webServer.title": "웹 서버",
- "settings.server.webServer.description": "웹 서버를 재시작하거나 정리합니다.",
- "settings.server.webServer.actions": "작업",
- "settings.server.webServer.reload": "재시작",
- "settings.server.webServer.watchLogs": "로그 보기",
- "settings.server.webServer.updateServerIp": "서버 IP 갱신",
- "settings.server.webServer.server.label": "서버",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "환경 변수 수정",
- "settings.server.webServer.storage.label": "저장 공간",
- "settings.server.webServer.storage.cleanUnusedImages": "사용하지 않는 이미지 정리",
- "settings.server.webServer.storage.cleanUnusedVolumes": "사용하지 않는 볼륨 정리",
- "settings.server.webServer.storage.cleanStoppedContainers": "정지된 컨테이너 정리",
- "settings.server.webServer.storage.cleanDockerBuilder": "도커 빌더 & 시스템 정리",
- "settings.server.webServer.storage.cleanMonitoring": "모니터링 데이터 정리",
- "settings.server.webServer.storage.cleanAll": "전체 정리",
+ "settings.server.webServer.title": "웹 서버",
+ "settings.server.webServer.description": "웹 서버를 재시작하거나 정리합니다.",
+ "settings.server.webServer.actions": "작업",
+ "settings.server.webServer.reload": "재시작",
+ "settings.server.webServer.watchLogs": "로그 보기",
+ "settings.server.webServer.updateServerIp": "서버 IP 갱신",
+ "settings.server.webServer.server.label": "서버",
+ "settings.server.webServer.traefik.label": "Traefik",
+ "settings.server.webServer.traefik.modifyEnv": "환경 변수 수정",
+ "settings.server.webServer.storage.label": "저장 공간",
+ "settings.server.webServer.storage.cleanUnusedImages": "사용하지 않는 이미지 정리",
+ "settings.server.webServer.storage.cleanUnusedVolumes": "사용하지 않는 볼륨 정리",
+ "settings.server.webServer.storage.cleanStoppedContainers": "정지된 컨테이너 정리",
+ "settings.server.webServer.storage.cleanDockerBuilder": "도커 빌더 & 시스템 정리",
+ "settings.server.webServer.storage.cleanMonitoring": "모니터링 데이터 정리",
+ "settings.server.webServer.storage.cleanAll": "전체 정리",
- "settings.profile.title": "계정",
- "settings.profile.description": "여기에서 프로필 세부 정보를 변경하세요.",
- "settings.profile.email": "이메일",
- "settings.profile.password": "비밀번호",
- "settings.profile.avatar": "아바타",
+ "settings.profile.title": "계정",
+ "settings.profile.description": "여기에서 프로필 세부 정보를 변경하세요.",
+ "settings.profile.email": "이메일",
+ "settings.profile.password": "비밀번호",
+ "settings.profile.avatar": "아바타",
- "settings.appearance.title": "외관",
- "settings.appearance.description": "대시보드의 테마를 사용자 설정합니다.",
- "settings.appearance.theme": "테마",
- "settings.appearance.themeDescription": "대시보드 테마 선택",
- "settings.appearance.themes.light": "라이트",
- "settings.appearance.themes.dark": "다크",
- "settings.appearance.themes.system": "시스템",
- "settings.appearance.language": "언어",
- "settings.appearance.languageDescription": "대시보드에서 사용할 언어 선택"
+ "settings.appearance.title": "외관",
+ "settings.appearance.description": "대시보드의 테마를 사용자 설정합니다.",
+ "settings.appearance.theme": "테마",
+ "settings.appearance.themeDescription": "대시보드 테마 선택",
+ "settings.appearance.themes.light": "라이트",
+ "settings.appearance.themes.dark": "다크",
+ "settings.appearance.themes.system": "시스템",
+ "settings.appearance.language": "언어",
+ "settings.appearance.languageDescription": "대시보드에서 사용할 언어 선택"
}
diff --git a/apps/dokploy/public/locales/kz/common.json b/apps/dokploy/public/locales/kz/common.json
index 9e26dfeeb..0967ef424 100644
--- a/apps/dokploy/public/locales/kz/common.json
+++ b/apps/dokploy/public/locales/kz/common.json
@@ -1 +1 @@
-{}
\ No newline at end of file
+{}
diff --git a/apps/dokploy/public/locales/kz/settings.json b/apps/dokploy/public/locales/kz/settings.json
index 97403d0e2..bf8f41372 100644
--- a/apps/dokploy/public/locales/kz/settings.json
+++ b/apps/dokploy/public/locales/kz/settings.json
@@ -1,41 +1,41 @@
{
- "settings.common.save": "Сақтау",
- "settings.server.domain.title": "Сервер домені",
- "settings.server.domain.description": "Dokploy сервер қолданбасына домен енгізіңіз.",
- "settings.server.domain.form.domain": "Домен",
- "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt Эл. поштасы",
- "settings.server.domain.form.certificate.label": "Сертификат",
- "settings.server.domain.form.certificate.placeholder": "Сертификатты таңдаңыз",
- "settings.server.domain.form.certificateOptions.none": "Жоқ",
- "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Стандартты)",
- "settings.server.webServer.title": "Веб-Сервер",
- "settings.server.webServer.description": "Веб-серверді қайта жүктеу немесе тазалау.",
- "settings.server.webServer.actions": "Әрекеттер",
- "settings.server.webServer.reload": "Қайта жүктеу",
- "settings.server.webServer.watchLogs": "Журналдарды қарау",
- "settings.server.webServer.updateServerIp": "Сервердің IP жаңарту",
- "settings.server.webServer.server.label": "Сервер",
- "settings.server.webServer.traefik.label": "Traefik",
- "settings.server.webServer.traefik.modifyEnv": "Env Өзгерту",
- "settings.server.webServer.storage.label": "Диск кеңістігі",
- "settings.server.webServer.storage.cleanUnusedImages": "Пайдаланылмаған образды тазалау",
- "settings.server.webServer.storage.cleanUnusedVolumes": "Пайдаланылмаған томды тазалау",
- "settings.server.webServer.storage.cleanStoppedContainers": "Тоқтатылған контейнерлерді тазалау",
- "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder & Системаны тазалау",
- "settings.server.webServer.storage.cleanMonitoring": "Мониторингті тазалау",
- "settings.server.webServer.storage.cleanAll": "Барлығын тазалау",
- "settings.profile.title": "Аккаунт",
- "settings.profile.description": "Профиль мәліметтерін осы жерден өзгертіңіз.",
- "settings.profile.email": "Эл. пошта",
- "settings.profile.password": "Құпия сөз",
- "settings.profile.avatar": "Аватар",
- "settings.appearance.title": "Сыртқы түрі",
- "settings.appearance.description": "Dokploy сыртқы келбетін өзгерту.",
- "settings.appearance.theme": "Келбеті",
- "settings.appearance.themeDescription": "Жүйе тақтасының келбетің таңдаңыз",
- "settings.appearance.themes.light": "Жарық",
- "settings.appearance.themes.dark": "Қараңғы",
- "settings.appearance.themes.system": "Жүйелік",
- "settings.appearance.language": "Тіл",
- "settings.appearance.languageDescription": "Жүйе тақтасының тілің таңдаңыз"
+ "settings.common.save": "Сақтау",
+ "settings.server.domain.title": "Сервер домені",
+ "settings.server.domain.description": "Dokploy сервер қолданбасына домен енгізіңіз.",
+ "settings.server.domain.form.domain": "Домен",
+ "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt Эл. поштасы",
+ "settings.server.domain.form.certificate.label": "Сертификат",
+ "settings.server.domain.form.certificate.placeholder": "Сертификатты таңдаңыз",
+ "settings.server.domain.form.certificateOptions.none": "Жоқ",
+ "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Стандартты)",
+ "settings.server.webServer.title": "Веб-Сервер",
+ "settings.server.webServer.description": "Веб-серверді қайта жүктеу немесе тазалау.",
+ "settings.server.webServer.actions": "Әрекеттер",
+ "settings.server.webServer.reload": "Қайта жүктеу",
+ "settings.server.webServer.watchLogs": "Журналдарды қарау",
+ "settings.server.webServer.updateServerIp": "Сервердің IP жаңарту",
+ "settings.server.webServer.server.label": "Сервер",
+ "settings.server.webServer.traefik.label": "Traefik",
+ "settings.server.webServer.traefik.modifyEnv": "Env Өзгерту",
+ "settings.server.webServer.storage.label": "Диск кеңістігі",
+ "settings.server.webServer.storage.cleanUnusedImages": "Пайдаланылмаған образды тазалау",
+ "settings.server.webServer.storage.cleanUnusedVolumes": "Пайдаланылмаған томды тазалау",
+ "settings.server.webServer.storage.cleanStoppedContainers": "Тоқтатылған контейнерлерді тазалау",
+ "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder & Системаны тазалау",
+ "settings.server.webServer.storage.cleanMonitoring": "Мониторингті тазалау",
+ "settings.server.webServer.storage.cleanAll": "Барлығын тазалау",
+ "settings.profile.title": "Аккаунт",
+ "settings.profile.description": "Профиль мәліметтерін осы жерден өзгертіңіз.",
+ "settings.profile.email": "Эл. пошта",
+ "settings.profile.password": "Құпия сөз",
+ "settings.profile.avatar": "Аватар",
+ "settings.appearance.title": "Сыртқы түрі",
+ "settings.appearance.description": "Dokploy сыртқы келбетін өзгерту.",
+ "settings.appearance.theme": "Келбеті",
+ "settings.appearance.themeDescription": "Жүйе тақтасының келбетің таңдаңыз",
+ "settings.appearance.themes.light": "Жарық",
+ "settings.appearance.themes.dark": "Қараңғы",
+ "settings.appearance.themes.system": "Жүйелік",
+ "settings.appearance.language": "Тіл",
+ "settings.appearance.languageDescription": "Жүйе тақтасының тілің таңдаңыз"
}
diff --git a/apps/dokploy/public/locales/pt-br/settings.json b/apps/dokploy/public/locales/pt-br/settings.json
index fc964be6c..f4d90a2f8 100644
--- a/apps/dokploy/public/locales/pt-br/settings.json
+++ b/apps/dokploy/public/locales/pt-br/settings.json
@@ -31,8 +31,8 @@
"settings.profile.email": "Email",
"settings.profile.password": "Senha",
"settings.profile.avatar": "Avatar",
-
- "settings.appearance.title": "Aparência",
+
+ "settings.appearance.title": "Aparencia",
"settings.appearance.description": "Personalize o tema do seu dashboard.",
"settings.appearance.theme": "Tema",
"settings.appearance.themeDescription": "Selecione um tema para o dashboard",
diff --git a/apps/dokploy/server/api/routers/notification.ts b/apps/dokploy/server/api/routers/notification.ts
index 504e33209..951d2a10d 100644
--- a/apps/dokploy/server/api/routers/notification.ts
+++ b/apps/dokploy/server/api/routers/notification.ts
@@ -190,7 +190,7 @@ export const notificationRouter = createTRPCRouter({
await sendDiscordNotification(input, {
title: "> `🤚` - Test Notification",
description: "> Hi, From Dokploy 👋",
- color: 0xf3f7f4
+ color: 0xf3f7f4,
});
return true;
} catch (error) {
diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts
index bbb907a32..ef418d2b6 100644
--- a/apps/dokploy/templates/templates.ts
+++ b/apps/dokploy/templates/templates.ts
@@ -1,990 +1,990 @@
import type { TemplateData } from "./types/templates-data.type";
export const templates: TemplateData[] = [
- {
- id: "supabase",
- name: "SupaBase",
- version: "1.24.07",
- description:
- "The open source Firebase alternative. Supabase gives you a dedicated Postgres database to build your web, mobile, and AI applications. ",
- links: {
- github: "https://github.com/supabase/supabase",
- website: "https://supabase.com/",
- docs: "https://supabase.com/docs/guides/self-hosting",
- },
- logo: "supabase.svg",
- load: () => import("./supabase/index").then((m) => m.generate),
- tags: ["database", "firebase", "postgres"],
- },
- {
- id: "pocketbase",
- name: "Pocketbase",
- version: "v0.22.12",
- description:
- "Pocketbase is a self-hosted alternative to Firebase that allows you to build and host your own backend services.",
- links: {
- github: "https://github.com/pocketbase/pocketbase",
- website: "https://pocketbase.io/",
- docs: "https://pocketbase.io/docs/",
- },
- logo: "pocketbase.svg",
- load: () => import("./pocketbase/index").then((m) => m.generate),
- tags: ["database", "cms", "headless"],
- },
- {
- id: "plausible",
- name: "Plausible",
- version: "v2.1.0",
- description:
- "Plausible is a open source, self-hosted web analytics platform that lets you track website traffic and user behavior.",
- logo: "plausible.svg",
- links: {
- github: "https://github.com/plausible/plausible",
- website: "https://plausible.io/",
- docs: "https://plausible.io/docs",
- },
- tags: ["analytics"],
- load: () => import("./plausible/index").then((m) => m.generate),
- },
- {
- id: "calcom",
- name: "Calcom",
- version: "v2.7.6",
- description:
- "Calcom is a open source alternative to Calendly that allows to create scheduling and booking services.",
+ {
+ id: "supabase",
+ name: "SupaBase",
+ version: "1.24.07",
+ description:
+ "The open source Firebase alternative. Supabase gives you a dedicated Postgres database to build your web, mobile, and AI applications. ",
+ links: {
+ github: "https://github.com/supabase/supabase",
+ website: "https://supabase.com/",
+ docs: "https://supabase.com/docs/guides/self-hosting",
+ },
+ logo: "supabase.svg",
+ load: () => import("./supabase/index").then((m) => m.generate),
+ tags: ["database", "firebase", "postgres"],
+ },
+ {
+ id: "pocketbase",
+ name: "Pocketbase",
+ version: "v0.22.12",
+ description:
+ "Pocketbase is a self-hosted alternative to Firebase that allows you to build and host your own backend services.",
+ links: {
+ github: "https://github.com/pocketbase/pocketbase",
+ website: "https://pocketbase.io/",
+ docs: "https://pocketbase.io/docs/",
+ },
+ logo: "pocketbase.svg",
+ load: () => import("./pocketbase/index").then((m) => m.generate),
+ tags: ["database", "cms", "headless"],
+ },
+ {
+ id: "plausible",
+ name: "Plausible",
+ version: "v2.1.0",
+ description:
+ "Plausible is a open source, self-hosted web analytics platform that lets you track website traffic and user behavior.",
+ logo: "plausible.svg",
+ links: {
+ github: "https://github.com/plausible/plausible",
+ website: "https://plausible.io/",
+ docs: "https://plausible.io/docs",
+ },
+ tags: ["analytics"],
+ load: () => import("./plausible/index").then((m) => m.generate),
+ },
+ {
+ id: "calcom",
+ name: "Calcom",
+ version: "v2.7.6",
+ description:
+ "Calcom is a open source alternative to Calendly that allows to create scheduling and booking services.",
- links: {
- github: "https://github.com/calcom/cal.com",
- website: "https://cal.com/",
- docs: "https://cal.com/docs",
- },
- logo: "calcom.jpg",
- tags: ["scheduling", "booking"],
- load: () => import("./calcom/index").then((m) => m.generate),
- },
- {
- id: "grafana",
- name: "Grafana",
- version: "9.5.20",
- description:
- "Grafana is an open source platform for data visualization and monitoring.",
- logo: "grafana.svg",
- links: {
- github: "https://github.com/grafana/grafana",
- website: "https://grafana.com/",
- docs: "https://grafana.com/docs/",
- },
- tags: ["monitoring"],
- load: () => import("./grafana/index").then((m) => m.generate),
- },
- {
- id: "directus",
- name: "Directus",
- version: "11.0.2",
- description:
- "Directus is an open source headless CMS that provides an API-first solution for building custom backends.",
- logo: "directus.jpg",
- links: {
- github: "https://github.com/directus/directus",
- website: "https://directus.io/",
- docs: "https://docs.directus.io/",
- },
- tags: ["cms"],
- load: () => import("./directus/index").then((m) => m.generate),
- },
- {
- id: "baserow",
- name: "Baserow",
- version: "1.25.2",
- description:
- "Baserow is an open source database management tool that allows you to create and manage databases.",
- logo: "baserow.webp",
- links: {
- github: "https://github.com/Baserow/baserow",
- website: "https://baserow.io/",
- docs: "https://baserow.io/docs/index",
- },
- tags: ["database"],
- load: () => import("./baserow/index").then((m) => m.generate),
- },
- {
- id: "ghost",
- name: "Ghost",
- version: "5.0.0",
- description:
- "Ghost is a free and open source, professional publishing platform built on a modern Node.js technology stack.",
- logo: "ghost.jpeg",
- links: {
- github: "https://github.com/TryGhost/Ghost",
- website: "https://ghost.org/",
- docs: "https://ghost.org/docs/",
- },
- tags: ["cms"],
- load: () => import("./ghost/index").then((m) => m.generate),
- },
- {
- id: "uptime-kuma",
- name: "Uptime Kuma",
- version: "1.23.15",
- description:
- "Uptime Kuma is a free and open source monitoring tool that allows you to monitor your websites and applications.",
- logo: "uptime-kuma.png",
- links: {
- github: "https://github.com/louislam/uptime-kuma",
- website: "https://uptime.kuma.pet/",
- docs: "https://github.com/louislam/uptime-kuma/wiki",
- },
- tags: ["monitoring"],
- load: () => import("./uptime-kuma/index").then((m) => m.generate),
- },
- {
- id: "n8n",
- name: "n8n",
- version: "1.48.1",
- description:
- "n8n is an open source low-code platform for automating workflows and integrations.",
- logo: "n8n.png",
- links: {
- github: "https://github.com/n8n-io/n8n",
- website: "https://n8n.io/",
- docs: "https://docs.n8n.io/",
- },
- tags: ["automation"],
- load: () => import("./n8n/index").then((m) => m.generate),
- },
- {
- id: "wordpress",
- name: "Wordpress",
- version: "5.8.3",
- description:
- "Wordpress is a free and open source content management system (CMS) for publishing and managing websites.",
- logo: "wordpress.png",
- links: {
- github: "https://github.com/WordPress/WordPress",
- website: "https://wordpress.org/",
- docs: "https://wordpress.org/documentation/",
- },
- tags: ["cms"],
- load: () => import("./wordpress/index").then((m) => m.generate),
- },
- {
- id: "odoo",
- name: "Odoo",
- version: "16.0",
- description:
- "Odoo is a free and open source business management software that helps you manage your company's operations.",
- logo: "odoo.png",
- links: {
- github: "https://github.com/odoo/odoo",
- website: "https://odoo.com/",
- docs: "https://www.odoo.com/documentation/",
- },
- tags: ["cms"],
- load: () => import("./odoo/index").then((m) => m.generate),
- },
- {
- id: "appsmith",
- name: "Appsmith",
- version: "v1.29",
- description:
- "Appsmith is a free and open source platform for building internal tools and applications.",
- logo: "appsmith.png",
- links: {
- github: "https://github.com/appsmithorg/appsmith",
- website: "https://appsmith.com/",
- docs: "https://docs.appsmith.com/",
- },
- tags: ["cms"],
- load: () => import("./appsmith/index").then((m) => m.generate),
- },
- {
- id: "excalidraw",
- name: "Excalidraw",
- version: "latest",
- description:
- "Excalidraw is a free and open source online diagramming tool that lets you easily create and share beautiful diagrams.",
- logo: "excalidraw.jpg",
- links: {
- github: "https://github.com/excalidraw/excalidraw",
- website: "https://excalidraw.com/",
- docs: "https://docs.excalidraw.com/",
- },
- tags: ["drawing"],
- load: () => import("./excalidraw/index").then((m) => m.generate),
- },
- {
- id: "documenso",
- name: "Documenso",
- version: "v1.5.6",
- description:
- "Documenso is the open source alternative to DocuSign for signing documents digitally",
- links: {
- github: "https://github.com/documenso/documenso",
- website: "https://documenso.com/",
- docs: "https://documenso.com/docs",
- },
- logo: "documenso.png",
- tags: ["document-signing"],
- load: () => import("./documenso/index").then((m) => m.generate),
- },
- {
- id: "nocodb",
- name: "NocoDB",
- version: "0.257.2",
- description:
- "NocoDB is an opensource Airtable alternative that turns any MySQL, PostgreSQL, SQL Server, SQLite & MariaDB into a smart spreadsheet.",
+ links: {
+ github: "https://github.com/calcom/cal.com",
+ website: "https://cal.com/",
+ docs: "https://cal.com/docs",
+ },
+ logo: "calcom.jpg",
+ tags: ["scheduling", "booking"],
+ load: () => import("./calcom/index").then((m) => m.generate),
+ },
+ {
+ id: "grafana",
+ name: "Grafana",
+ version: "9.5.20",
+ description:
+ "Grafana is an open source platform for data visualization and monitoring.",
+ logo: "grafana.svg",
+ links: {
+ github: "https://github.com/grafana/grafana",
+ website: "https://grafana.com/",
+ docs: "https://grafana.com/docs/",
+ },
+ tags: ["monitoring"],
+ load: () => import("./grafana/index").then((m) => m.generate),
+ },
+ {
+ id: "directus",
+ name: "Directus",
+ version: "11.0.2",
+ description:
+ "Directus is an open source headless CMS that provides an API-first solution for building custom backends.",
+ logo: "directus.jpg",
+ links: {
+ github: "https://github.com/directus/directus",
+ website: "https://directus.io/",
+ docs: "https://docs.directus.io/",
+ },
+ tags: ["cms"],
+ load: () => import("./directus/index").then((m) => m.generate),
+ },
+ {
+ id: "baserow",
+ name: "Baserow",
+ version: "1.25.2",
+ description:
+ "Baserow is an open source database management tool that allows you to create and manage databases.",
+ logo: "baserow.webp",
+ links: {
+ github: "https://github.com/Baserow/baserow",
+ website: "https://baserow.io/",
+ docs: "https://baserow.io/docs/index",
+ },
+ tags: ["database"],
+ load: () => import("./baserow/index").then((m) => m.generate),
+ },
+ {
+ id: "ghost",
+ name: "Ghost",
+ version: "5.0.0",
+ description:
+ "Ghost is a free and open source, professional publishing platform built on a modern Node.js technology stack.",
+ logo: "ghost.jpeg",
+ links: {
+ github: "https://github.com/TryGhost/Ghost",
+ website: "https://ghost.org/",
+ docs: "https://ghost.org/docs/",
+ },
+ tags: ["cms"],
+ load: () => import("./ghost/index").then((m) => m.generate),
+ },
+ {
+ id: "uptime-kuma",
+ name: "Uptime Kuma",
+ version: "1.23.15",
+ description:
+ "Uptime Kuma is a free and open source monitoring tool that allows you to monitor your websites and applications.",
+ logo: "uptime-kuma.png",
+ links: {
+ github: "https://github.com/louislam/uptime-kuma",
+ website: "https://uptime.kuma.pet/",
+ docs: "https://github.com/louislam/uptime-kuma/wiki",
+ },
+ tags: ["monitoring"],
+ load: () => import("./uptime-kuma/index").then((m) => m.generate),
+ },
+ {
+ id: "n8n",
+ name: "n8n",
+ version: "1.48.1",
+ description:
+ "n8n is an open source low-code platform for automating workflows and integrations.",
+ logo: "n8n.png",
+ links: {
+ github: "https://github.com/n8n-io/n8n",
+ website: "https://n8n.io/",
+ docs: "https://docs.n8n.io/",
+ },
+ tags: ["automation"],
+ load: () => import("./n8n/index").then((m) => m.generate),
+ },
+ {
+ id: "wordpress",
+ name: "Wordpress",
+ version: "5.8.3",
+ description:
+ "Wordpress is a free and open source content management system (CMS) for publishing and managing websites.",
+ logo: "wordpress.png",
+ links: {
+ github: "https://github.com/WordPress/WordPress",
+ website: "https://wordpress.org/",
+ docs: "https://wordpress.org/documentation/",
+ },
+ tags: ["cms"],
+ load: () => import("./wordpress/index").then((m) => m.generate),
+ },
+ {
+ id: "odoo",
+ name: "Odoo",
+ version: "16.0",
+ description:
+ "Odoo is a free and open source business management software that helps you manage your company's operations.",
+ logo: "odoo.png",
+ links: {
+ github: "https://github.com/odoo/odoo",
+ website: "https://odoo.com/",
+ docs: "https://www.odoo.com/documentation/",
+ },
+ tags: ["cms"],
+ load: () => import("./odoo/index").then((m) => m.generate),
+ },
+ {
+ id: "appsmith",
+ name: "Appsmith",
+ version: "v1.29",
+ description:
+ "Appsmith is a free and open source platform for building internal tools and applications.",
+ logo: "appsmith.png",
+ links: {
+ github: "https://github.com/appsmithorg/appsmith",
+ website: "https://appsmith.com/",
+ docs: "https://docs.appsmith.com/",
+ },
+ tags: ["cms"],
+ load: () => import("./appsmith/index").then((m) => m.generate),
+ },
+ {
+ id: "excalidraw",
+ name: "Excalidraw",
+ version: "latest",
+ description:
+ "Excalidraw is a free and open source online diagramming tool that lets you easily create and share beautiful diagrams.",
+ logo: "excalidraw.jpg",
+ links: {
+ github: "https://github.com/excalidraw/excalidraw",
+ website: "https://excalidraw.com/",
+ docs: "https://docs.excalidraw.com/",
+ },
+ tags: ["drawing"],
+ load: () => import("./excalidraw/index").then((m) => m.generate),
+ },
+ {
+ id: "documenso",
+ name: "Documenso",
+ version: "v1.5.6",
+ description:
+ "Documenso is the open source alternative to DocuSign for signing documents digitally",
+ links: {
+ github: "https://github.com/documenso/documenso",
+ website: "https://documenso.com/",
+ docs: "https://documenso.com/docs",
+ },
+ logo: "documenso.png",
+ tags: ["document-signing"],
+ load: () => import("./documenso/index").then((m) => m.generate),
+ },
+ {
+ id: "nocodb",
+ name: "NocoDB",
+ version: "0.257.2",
+ description:
+ "NocoDB is an opensource Airtable alternative that turns any MySQL, PostgreSQL, SQL Server, SQLite & MariaDB into a smart spreadsheet.",
- links: {
- github: "https://github.com/nocodb/nocodb",
- website: "https://nocodb.com/",
- docs: "https://docs.nocodb.com/",
- },
- logo: "nocodb.png",
- tags: ["database", "spreadsheet", "low-code", "nocode"],
- load: () => import("./nocodb/index").then((m) => m.generate),
- },
- {
- id: "meilisearch",
- name: "Meilisearch",
- version: "v1.8.3",
- description:
- "Meilisearch is a free and open-source search engine that allows you to easily add search functionality to your web applications.",
- logo: "meilisearch.png",
- links: {
- github: "https://github.com/meilisearch/meilisearch",
- website: "https://www.meilisearch.com/",
- docs: "https://docs.meilisearch.com/",
- },
- tags: ["search"],
- load: () => import("./meilisearch/index").then((m) => m.generate),
- },
- {
- id: "phpmyadmin",
- name: "Phpmyadmin",
- version: "5.2.1",
- description:
- "Phpmyadmin is a free and open-source web interface for MySQL and MariaDB that allows you to manage your databases.",
- logo: "phpmyadmin.png",
- links: {
- github: "https://github.com/phpmyadmin/phpmyadmin",
- website: "https://www.phpmyadmin.net/",
- docs: "https://www.phpmyadmin.net/docs/",
- },
- tags: ["database"],
- load: () => import("./phpmyadmin/index").then((m) => m.generate),
- },
- {
- id: "rocketchat",
- name: "Rocketchat",
- version: "6.9.2",
- description:
- "Rocket.Chat is a free and open-source web chat platform that allows you to build and manage your own chat applications.",
- logo: "rocketchat.png",
- links: {
- github: "https://github.com/RocketChat/Rocket.Chat",
- website: "https://rocket.chat/",
- docs: "https://rocket.chat/docs/",
- },
- tags: ["chat"],
- load: () => import("./rocketchat/index").then((m) => m.generate),
- },
- {
- id: "minio",
- name: "Minio",
- description:
- "Minio is an open source object storage server compatible with Amazon S3 cloud storage service.",
- logo: "minio.png",
- version: "latest",
- links: {
- github: "https://github.com/minio/minio",
- website: "https://minio.io/",
- docs: "https://docs.minio.io/",
- },
- tags: ["storage"],
- load: () => import("./minio/index").then((m) => m.generate),
- },
- {
- id: "metabase",
- name: "Metabase",
- version: "v0.50.8",
- description:
- "Metabase is an open source business intelligence tool that allows you to ask questions and visualize data.",
- logo: "metabase.png",
- links: {
- github: "https://github.com/metabase/metabase",
- website: "https://www.metabase.com/",
- docs: "https://www.metabase.com/docs/",
- },
- tags: ["database", "dashboard"],
- load: () => import("./metabase/index").then((m) => m.generate),
- },
- {
- id: "glitchtip",
- name: "Glitchtip",
- version: "v4.0",
- description: "Glitchtip is simple, open source error tracking",
- logo: "glitchtip.png",
- links: {
- github: "https://gitlab.com/glitchtip/",
- website: "https://glitchtip.com/",
- docs: "https://glitchtip.com/documentation",
- },
- tags: ["hosting"],
- load: () => import("./glitchtip/index").then((m) => m.generate),
- },
- {
- id: "open-webui",
- name: "Open WebUI",
- version: "v0.3.7",
- description:
- "Open WebUI is a free and open source chatgpt alternative. Open WebUI is an extensible, feature-rich, and user-friendly self-hosted WebUI designed to operate entirely offline. It supports various LLM runners, including Ollama and OpenAI-compatible APIs. The template include ollama and webui services.",
- logo: "open-webui.png",
- links: {
- github: "https://github.com/open-webui/open-webui",
- website: "https://openwebui.com/",
- docs: "https://docs.openwebui.com/",
- },
- tags: ["chat"],
- load: () => import("./open-webui/index").then((m) => m.generate),
- },
- {
- id: "listmonk",
- name: "Listmonk",
- version: "v3.0.0",
- description:
- "High performance, self-hosted, newsletter and mailing list manager with a modern dashboard.",
- logo: "listmonk.png",
- links: {
- github: "https://github.com/knadh/listmonk",
- website: "https://listmonk.app/",
- docs: "https://listmonk.app/docs/",
- },
- tags: ["email", "newsletter", "mailing-list"],
- load: () => import("./listmonk/index").then((m) => m.generate),
- },
- {
- id: "doublezero",
- name: "Double Zero",
- version: "v0.2.1",
- description:
- "00 is a self hostable SES dashboard for sending and monitoring emails with AWS",
- logo: "doublezero.svg",
- links: {
- github: "https://github.com/technomancy-dev/00",
- website: "https://www.double-zero.cloud/",
- docs: "https://github.com/technomancy-dev/00",
- },
- tags: ["email"],
- load: () => import("./doublezero/index").then((m) => m.generate),
- },
- {
- id: "umami",
- name: "Umami",
- version: "v2.14.0",
- description:
- "Umami is a simple, fast, privacy-focused alternative to Google Analytics.",
- logo: "umami.png",
- links: {
- github: "https://github.com/umami-software/umami",
- website: "https://umami.is",
- docs: "https://umami.is/docs",
- },
- tags: ["analytics"],
- load: () => import("./umami/index").then((m) => m.generate),
- },
- {
- id: "jellyfin",
- name: "jellyfin",
- version: "v10.9.7",
- description:
- "Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. ",
- logo: "jellyfin.svg",
- links: {
- github: "https://github.com/jellyfin/jellyfin",
- website: "https://jellyfin.org/",
- docs: "https://jellyfin.org/docs/",
- },
- tags: ["media system"],
- load: () => import("./jellyfin/index").then((m) => m.generate),
- },
- {
- id: "teable",
- name: "teable",
- version: "v1.3.1-alpha-build.460",
- description:
- "Teable is a Super fast, Real-time, Professional, Developer friendly, No-code database built on Postgres. It uses a simple, spreadsheet-like interface to create complex enterprise-level database applications. Unlock efficient app development with no-code, free from the hurdles of data security and scalability.",
- logo: "teable.png",
- links: {
- github: "https://github.com/teableio/teable",
- website: "https://teable.io/",
- docs: "https://help.teable.io/",
- },
- tags: ["database", "spreadsheet", "low-code", "nocode"],
- load: () => import("./teable/index").then((m) => m.generate),
- },
- {
- id: "zipline",
- name: "Zipline",
- version: "v3.7.9",
- description:
- "A ShareX/file upload server that is easy to use, packed with features, and with an easy setup!",
- logo: "zipline.png",
- links: {
- github: "https://github.com/diced/zipline",
- website: "https://zipline.diced.sh/",
- docs: "https://zipline.diced.sh/docs/",
- },
- tags: ["media system", "storage"],
- load: () => import("./zipline/index").then((m) => m.generate),
- },
- {
- id: "soketi",
- name: "Soketi",
- version: "v1.6.1-16",
- description:
- "Soketi is your simple, fast, and resilient open-source WebSockets server.",
- logo: "soketi.png",
- links: {
- github: "https://github.com/soketi/soketi",
- website: "https://soketi.app/",
- docs: "https://docs.soketi.app/",
- },
- tags: ["chat"],
- load: () => import("./soketi/index").then((m) => m.generate),
- },
- {
- id: "aptabase",
- name: "Aptabase",
- version: "v1.0.0",
- description:
- "Aptabase is a self-hosted web analytics platform that lets you track website traffic and user behavior.",
- logo: "aptabase.svg",
- links: {
- github: "https://github.com/aptabase/aptabase",
- website: "https://aptabase.com/",
- docs: "https://github.com/aptabase/aptabase/blob/main/README.md",
- },
- tags: ["analytics", "self-hosted"],
- load: () => import("./aptabase/index").then((m) => m.generate),
- },
- {
- id: "typebot",
- name: "Typebot",
- version: "2.27.0",
- description: "Typebot is an open-source chatbot builder platform.",
- logo: "typebot.svg",
- links: {
- github: "https://github.com/baptisteArno/typebot.io",
- website: "https://typebot.io/",
- docs: "https://docs.typebot.io/get-started/introduction",
- },
- tags: ["chatbot", "builder", "open-source"],
- load: () => import("./typebot/index").then((m) => m.generate),
- },
- {
- id: "gitea",
- name: "Gitea",
- version: "1.22.3",
- description:
- "Git with a cup of tea! Painless self-hosted all-in-one software development service, including Git hosting, code review, team collaboration, package registry and CI/CD.",
- logo: "gitea.png",
- links: {
- github: "https://github.com/go-gitea/gitea.git",
- website: "https://gitea.com/",
- docs: "https://docs.gitea.com/installation/install-with-docker",
- },
- tags: ["self-hosted", "storage"],
- load: () => import("./gitea/index").then((m) => m.generate),
- },
- {
- id: "roundcube",
- name: "Roundcube",
- version: "1.6.9",
- description:
- "Free and open source webmail software for the masses, written in PHP.",
- logo: "roundcube.svg",
- links: {
- github: "https://github.com/roundcube/roundcubemail",
- website: "https://roundcube.net/",
- docs: "https://roundcube.net/about/",
- },
- tags: ["self-hosted", "email", "webmail"],
- load: () => import("./roundcube/index").then((m) => m.generate),
- },
- {
- id: "filebrowser",
- name: "File Browser",
- version: "2.31.2",
- description:
- "Filebrowser is a standalone file manager for uploading, deleting, previewing, renaming, and editing files, with support for multiple users, each with their own directory.",
- logo: "filebrowser.svg",
- links: {
- github: "https://github.com/filebrowser/filebrowser",
- website: "https://filebrowser.org/",
- docs: "https://filebrowser.org/",
- },
- tags: ["file", "manager"],
- load: () => import("./filebrowser/index").then((m) => m.generate),
- },
- {
- id: "tolgee",
- name: "Tolgee",
- version: "v3.80.4",
- description:
- "Developer & translator friendly web-based localization platform",
- logo: "tolgee.svg",
- links: {
- github: "https://github.com/tolgee/tolgee-platform",
- website: "https://tolgee.io",
- docs: "https://tolgee.io/platform",
- },
- tags: ["self-hosted", "i18n", "localization", "translations"],
- load: () => import("./tolgee/index").then((m) => m.generate),
- },
- {
- id: "portainer",
- name: "Portainer",
- version: "2.21.4",
- description:
- "Portainer is a container management tool for deploying, troubleshooting, and securing applications across cloud, data centers, and IoT.",
- logo: "portainer.svg",
- links: {
- github: "https://github.com/portainer/portainer",
- website: "https://www.portainer.io/",
- docs: "https://docs.portainer.io/",
- },
- tags: ["cloud", "monitoring"],
- load: () => import("./portainer/index").then((m) => m.generate),
- },
- {
- id: "influxdb",
- name: "InfluxDB",
- version: "2.7.10",
- description:
- "InfluxDB 2.7 is the platform purpose-built to collect, store, process and visualize time series data.",
- logo: "influxdb.png",
- links: {
- github: "https://github.com/influxdata/influxdb",
- website: "https://www.influxdata.com/",
- docs: "https://docs.influxdata.com/influxdb/v2/",
- },
- tags: ["self-hosted", "open-source", "storage", "database"],
- load: () => import("./influxdb/index").then((m) => m.generate),
- },
- {
- id: "infisical",
- name: "Infisical",
- version: "0.90.1",
- description:
- "All-in-one platform to securely manage application configuration and secrets across your team and infrastructure.",
- logo: "infisical.jpg",
- links: {
- github: "https://github.com/Infisical/infisical",
- website: "https://infisical.com/",
- docs: "https://infisical.com/docs/documentation/getting-started/introduction",
- },
- tags: ["self-hosted", "open-source"],
- load: () => import("./infisical/index").then((m) => m.generate),
- },
- {
- id: "docmost",
- name: "Docmost",
- version: "0.4.1",
- description:
- "Docmost, is an open-source collaborative wiki and documentation software.",
- logo: "docmost.png",
- links: {
- github: "https://github.com/docmost/docmost",
- website: "https://docmost.com/",
- docs: "https://docmost.com/docs/",
- },
- tags: ["self-hosted", "open-source", "manager"],
- load: () => import("./docmost/index").then((m) => m.generate),
- },
- {
- id: "vaultwarden",
- name: "Vaultwarden",
- version: "1.32.3",
- description:
- "Unofficial Bitwarden compatible server written in Rust, formerly known as bitwarden_rs",
- logo: "vaultwarden.svg",
- links: {
- github: "https://github.com/dani-garcia/vaultwarden",
- website: "",
- docs: "https://github.com/dani-garcia/vaultwarden/wiki",
- },
- tags: ["open-source"],
- load: () => import("./vaultwarden/index").then((m) => m.generate),
- },
- {
- id: "hi-events",
- name: "Hi.events",
- version: "0.8.0-beta.1",
- description:
- "Hi.Events is a self-hosted event management and ticket selling platform that allows you to create, manage and promote events easily.",
- logo: "hi-events.svg",
- links: {
- github: "https://github.com/HiEventsDev/hi.events",
- website: "https://hi.events/",
- docs: "https://hi.events/docs",
- },
- tags: ["self-hosted", "open-source", "manager"],
- load: () => import("./hi-events/index").then((m) => m.generate),
- },
- {
- id: "windows",
- name: "Windows (dockerized)",
- version: "4.00",
- description: "Windows inside a Docker container.",
- logo: "windows.png",
- links: {
- github: "https://github.com/dockur/windows",
- website: "",
- docs: "https://github.com/dockur/windows?tab=readme-ov-file#how-do-i-use-it",
- },
- tags: ["self-hosted", "open-source", "os"],
- load: () => import("./windows/index").then((m) => m.generate),
- },
- {
- id: "macos",
- name: "MacOS (dockerized)",
- version: "1.14",
- description: "MacOS inside a Docker container.",
- logo: "macos.png",
- links: {
- github: "https://github.com/dockur/macos",
- website: "",
- docs: "https://github.com/dockur/macos?tab=readme-ov-file#how-do-i-use-it",
- },
- tags: ["self-hosted", "open-source", "os"],
- load: () => import("./macos/index").then((m) => m.generate),
- },
- {
- id: "coder",
- name: "Coder",
- version: "2.15.3",
- description:
- "Coder is an open-source cloud development environment (CDE) that you host in your cloud or on-premises.",
- logo: "coder.svg",
- links: {
- github: "https://github.com/coder/coder",
- website: "https://coder.com/",
- docs: "https://coder.com/docs",
- },
- tags: ["self-hosted", "open-source", "builder"],
- load: () => import("./coder/index").then((m) => m.generate),
- },
- {
- id: "stirling",
- name: "Stirling PDF",
- version: "0.30.1",
- description: "A locally hosted one-stop shop for all your PDF needs",
- logo: "stirling.svg",
- links: {
- github: "https://github.com/Stirling-Tools/Stirling-PDF",
- website: "https://www.stirlingpdf.com/",
- docs: "https://docs.stirlingpdf.com/",
- },
- tags: ["pdf", "tools"],
- load: () => import("./stirling/index").then((m) => m.generate),
- },
- {
- id: "lobe-chat",
- name: "Lobe Chat",
- version: "v1.26.1",
- description: "Lobe Chat - an open-source, modern-design AI chat framework.",
- logo: "lobe-chat.png",
- links: {
- github: "https://github.com/lobehub/lobe-chat",
- website: "https://chat-preview.lobehub.com/",
- docs: "https://lobehub.com/docs/self-hosting/platform/docker-compose",
- },
- tags: ["IA", "chat"],
- load: () => import("./lobe-chat/index").then((m) => m.generate),
- },
- {
- id: "peppermint",
- name: "Peppermint",
- version: "latest",
- description:
- "Peppermint is a modern, open-source API development platform that helps you build, test and document your APIs.",
- logo: "peppermint.svg",
- links: {
- github: "https://github.com/Peppermint-Lab/peppermint",
- website: "https://peppermint.sh/",
- docs: "https://docs.peppermint.sh/",
- },
- tags: ["api", "development", "documentation"],
- load: () => import("./peppermint/index").then((m) => m.generate),
- },
- {
- id: "windmill",
- name: "Windmill",
- version: "latest",
- description:
- "A developer platform to build production-grade workflows and internal apps. Open-source alternative to Airplane, Retool, and GitHub Actions.",
- logo: "windmill.svg",
- links: {
- github: "https://github.com/windmill-labs/windmill",
- website: "https://www.windmill.dev/",
- docs: "https://docs.windmill.dev/",
- },
- tags: ["workflow", "automation", "development"],
- load: () => import("./windmill/index").then((m) => m.generate),
- },
- {
- id: "activepieces",
- name: "Activepieces",
- version: "0.35.0",
- description:
- "Open-source no-code business automation tool. An alternative to Zapier, Make.com, and Tray.",
- logo: "activepieces.svg",
- links: {
- github: "https://github.com/activepieces/activepieces",
- website: "https://www.activepieces.com/",
- docs: "https://www.activepieces.com/docs",
- },
- tags: ["automation", "workflow", "no-code"],
- load: () => import("./activepieces/index").then((m) => m.generate),
- },
- {
- id: "invoiceshelf",
- name: "InvoiceShelf",
- version: "latest",
- description:
- "InvoiceShelf is a self-hosted open source invoicing system for freelancers and small businesses.",
- logo: "invoiceshelf.png",
- links: {
- github: "https://github.com/InvoiceShelf/invoiceshelf",
- website: "https://invoiceshelf.com",
- docs: "https://github.com/InvoiceShelf/invoiceshelf#readme",
- },
- tags: ["invoice", "business", "finance"],
- load: () => import("./invoiceshelf/index").then((m) => m.generate),
- },
- {
- id: "postiz",
- name: "Postiz",
- version: "latest",
- description:
- "Postiz is a modern, open-source platform for managing and publishing content across multiple channels.",
- logo: "postiz.png",
- links: {
- github: "https://github.com/gitroomhq/postiz",
- website: "https://postiz.com",
- docs: "https://docs.postiz.com",
- },
- tags: ["cms", "content-management", "publishing"],
- load: () => import("./postiz/index").then((m) => m.generate),
- },
- {
- id: "slash",
- name: "Slash",
- version: "latest",
- description:
- "Slash is a modern, self-hosted bookmarking service and link shortener that helps you organize and share your favorite links.",
- logo: "slash.png",
- links: {
- github: "https://github.com/yourselfhosted/slash",
- website: "https://github.com/yourselfhosted/slash#readme",
- docs: "https://github.com/yourselfhosted/slash/wiki",
- },
- tags: ["bookmarks", "link-shortener", "self-hosted"],
- load: () => import("./slash/index").then((m) => m.generate),
- },
- {
- id: "discord-tickets",
- name: "Discord Tickets",
- version: "4.0.21",
- description:
- "An open-source Discord bot for creating and managing support ticket channels.",
- logo: "discord-tickets.png",
- links: {
- github: "https://github.com/discord-tickets/bot",
- website: "https://discordtickets.app",
- docs: "https://discordtickets.app/self-hosting/installation/docker/",
- },
- tags: ["discord", "tickets", "support"],
- load: () => import("./discord-tickets/index").then((m) => m.generate),
- },
- {
- id: "nextcloud-aio",
- name: "Nextcloud All in One",
- version: "30.0.2",
- description:
- "Nextcloud (AIO) is a self-hosted file storage and sync platform with powerful collaboration capabilities. It integrates Files, Talk, Groupware, Office, Assistant and more into a single platform for remote work and data protection.",
- logo: "nextcloud-aio.svg",
- links: {
- github: "https://github.com/nextcloud/docker",
- website: "https://nextcloud.com/",
- docs: "https://docs.nextcloud.com/",
- },
- tags: ["file", "sync"],
- load: () => import("./nextcloud-aio/index").then((m) => m.generate),
- },
- {
- id: "blender",
- name: "Blender",
- version: "latest",
- description:
- "Blender is a free and open-source 3D creation suite. It supports the entire 3D pipeline—modeling, rigging, animation, simulation, rendering, compositing and motion tracking, video editing and 2D animation pipeline.",
- logo: "blender.svg",
- links: {
- github: "https://github.com/linuxserver/docker-blender",
- website: "https://www.blender.org/",
- docs: "https://docs.blender.org/",
- },
- tags: ["3d", "rendering", "animation"],
- load: () => import("./blender/index").then((m) => m.generate),
- },
- {
- id: "heyform",
- name: "HeyForm",
- version: "latest",
- description:
- "Allows anyone to create engaging conversational forms for surveys, questionnaires, quizzes, and polls. No coding skills required.",
- logo: "heyform.svg",
- links: {
- github: "https://github.com/heyform/heyform",
- website: "https://heyform.net",
- docs: "https://docs.heyform.net",
- },
- tags: ["form", "builder", "questionnaire", "quiz", "survey"],
- load: () => import("./heyform/index").then((m) => m.generate),
- },
- {
- id: "chatwoot",
- name: "Chatwoot",
- version: "v3.14.1",
- description:
- "Open-source customer engagement platform that provides a shared inbox for teams, live chat, and omnichannel support.",
- logo: "chatwoot.svg",
- links: {
- github: "https://github.com/chatwoot/chatwoot",
- website: "https://www.chatwoot.com",
- docs: "https://www.chatwoot.com/docs",
- },
- tags: ["support", "chat", "customer-service"],
- load: () => import("./chatwoot/index").then((m) => m.generate),
- },
- {
- id: "discourse",
- name: "Discourse",
- version: "3.3.2",
- description:
- "Discourse is a modern forum software for your community. Use it as a mailing list, discussion forum, or long-form chat room.",
- logo: "discourse.svg",
- links: {
- github: "https://github.com/discourse/discourse",
- website: "https://www.discourse.org/",
- docs: "https://meta.discourse.org/",
- },
- tags: ["forum", "community", "discussion"],
- load: () => import("./discourse/index").then((m) => m.generate),
- },
- {
- id: "immich",
- name: "Immich",
- version: "v1.121.0",
- description:
- "High performance self-hosted photo and video backup solution directly from your mobile phone.",
- logo: "immich.svg",
- links: {
- github: "https://github.com/immich-app/immich",
- website: "https://immich.app/",
- docs: "https://immich.app/docs/overview/introduction",
- },
- tags: ["photos", "videos", "backup", "media"],
- load: () => import("./immich/index").then((m) => m.generate),
- },
- {
- id: "twenty",
- name: "Twenty CRM",
- version: "latest",
- description:
- "Twenty is a modern CRM offering a powerful spreadsheet interface and open-source alternative to Salesforce.",
- logo: "twenty.svg",
- links: {
- github: "https://github.com/twentyhq/twenty",
- website: "https://twenty.com",
- docs: "https://docs.twenty.com",
- },
- tags: ["crm", "sales", "business"],
- load: () => import("./twenty/index").then((m) => m.generate),
- },
- {
- id: "yourls",
- name: "YOURLS",
- version: "1.9.2",
- description:
- "YOURLS (Your Own URL Shortener) is a set of PHP scripts that will allow you to run your own URL shortening service (a la TinyURL or Bitly).",
- logo: "yourls.svg",
- links: {
- github: "https://github.com/YOURLS/YOURLS",
- website: "https://yourls.org/",
- docs: "https://yourls.org/#documentation",
- },
- tags: ["url-shortener", "php"],
- load: () => import("./yourls/index").then((m) => m.generate),
- },
- {
- id: "ryot",
- name: "Ryot",
- version: "v7.10",
- description:
- "A self-hosted platform for tracking various media types including movies, TV shows, video games, books, audiobooks, and more.",
- logo: "ryot.png",
- links: {
- github: "https://github.com/IgnisDa/ryot",
- website: "https://ryot.dev/",
- docs: "https://ryot.dev/docs/getting-started",
- },
- tags: ["media", "tracking", "self-hosted"],
- load: () => import("./ryot/index").then((m) => m.generate),
- },
- {
- id: "photoprism",
- name: "Photoprism",
- version: "latest",
- description:
- "PhotoPrism® is an AI-Powered Photos App for the Decentralized Web. It makes use of the latest technologies to tag and find pictures automatically without getting in your way.",
- logo: "photoprism.svg",
- links: {
- github: "https://github.com/photoprism/photoprism",
- website: "https://www.photoprism.app/",
- docs: "https://docs.photoprism.app/",
- },
- tags: ["media", "photos", "self-hosted"],
- load: () => import("./photoprism/index").then((m) => m.generate),
- },
- {
- id: "ontime",
- name: "Ontime",
- version: "v3.8.0",
- description:
- "Ontime is browser-based application that manages event rundowns, scheduliing and cuing",
- logo: "ontime.png",
- links: {
- github: "https://github.com/cpvalente/ontime/",
- website: "https://getontime.no",
- docs: "https://docs.getontime.no",
- },
- tags: ["event"],
- load: () => import("./ontime/index").then((m) => m.generate),
- },
- {
- id: "triggerdotdev",
- name: "Trigger.dev",
- version: "v3",
- description:
- "Trigger is a platform for building event-driven applications.",
- logo: "triggerdotdev.svg",
- links: {
- github: "https://github.com/triggerdotdev/trigger.dev",
- website: "https://trigger.dev/",
- docs: "https://trigger.dev/docs",
- },
- tags: ["event-driven", "applications"],
- load: () => import("./triggerdotdev/index").then((m) => m.generate),
- },
+ links: {
+ github: "https://github.com/nocodb/nocodb",
+ website: "https://nocodb.com/",
+ docs: "https://docs.nocodb.com/",
+ },
+ logo: "nocodb.png",
+ tags: ["database", "spreadsheet", "low-code", "nocode"],
+ load: () => import("./nocodb/index").then((m) => m.generate),
+ },
+ {
+ id: "meilisearch",
+ name: "Meilisearch",
+ version: "v1.8.3",
+ description:
+ "Meilisearch is a free and open-source search engine that allows you to easily add search functionality to your web applications.",
+ logo: "meilisearch.png",
+ links: {
+ github: "https://github.com/meilisearch/meilisearch",
+ website: "https://www.meilisearch.com/",
+ docs: "https://docs.meilisearch.com/",
+ },
+ tags: ["search"],
+ load: () => import("./meilisearch/index").then((m) => m.generate),
+ },
+ {
+ id: "phpmyadmin",
+ name: "Phpmyadmin",
+ version: "5.2.1",
+ description:
+ "Phpmyadmin is a free and open-source web interface for MySQL and MariaDB that allows you to manage your databases.",
+ logo: "phpmyadmin.png",
+ links: {
+ github: "https://github.com/phpmyadmin/phpmyadmin",
+ website: "https://www.phpmyadmin.net/",
+ docs: "https://www.phpmyadmin.net/docs/",
+ },
+ tags: ["database"],
+ load: () => import("./phpmyadmin/index").then((m) => m.generate),
+ },
+ {
+ id: "rocketchat",
+ name: "Rocketchat",
+ version: "6.9.2",
+ description:
+ "Rocket.Chat is a free and open-source web chat platform that allows you to build and manage your own chat applications.",
+ logo: "rocketchat.png",
+ links: {
+ github: "https://github.com/RocketChat/Rocket.Chat",
+ website: "https://rocket.chat/",
+ docs: "https://rocket.chat/docs/",
+ },
+ tags: ["chat"],
+ load: () => import("./rocketchat/index").then((m) => m.generate),
+ },
+ {
+ id: "minio",
+ name: "Minio",
+ description:
+ "Minio is an open source object storage server compatible with Amazon S3 cloud storage service.",
+ logo: "minio.png",
+ version: "latest",
+ links: {
+ github: "https://github.com/minio/minio",
+ website: "https://minio.io/",
+ docs: "https://docs.minio.io/",
+ },
+ tags: ["storage"],
+ load: () => import("./minio/index").then((m) => m.generate),
+ },
+ {
+ id: "metabase",
+ name: "Metabase",
+ version: "v0.50.8",
+ description:
+ "Metabase is an open source business intelligence tool that allows you to ask questions and visualize data.",
+ logo: "metabase.png",
+ links: {
+ github: "https://github.com/metabase/metabase",
+ website: "https://www.metabase.com/",
+ docs: "https://www.metabase.com/docs/",
+ },
+ tags: ["database", "dashboard"],
+ load: () => import("./metabase/index").then((m) => m.generate),
+ },
+ {
+ id: "glitchtip",
+ name: "Glitchtip",
+ version: "v4.0",
+ description: "Glitchtip is simple, open source error tracking",
+ logo: "glitchtip.png",
+ links: {
+ github: "https://gitlab.com/glitchtip/",
+ website: "https://glitchtip.com/",
+ docs: "https://glitchtip.com/documentation",
+ },
+ tags: ["hosting"],
+ load: () => import("./glitchtip/index").then((m) => m.generate),
+ },
+ {
+ id: "open-webui",
+ name: "Open WebUI",
+ version: "v0.3.7",
+ description:
+ "Open WebUI is a free and open source chatgpt alternative. Open WebUI is an extensible, feature-rich, and user-friendly self-hosted WebUI designed to operate entirely offline. It supports various LLM runners, including Ollama and OpenAI-compatible APIs. The template include ollama and webui services.",
+ logo: "open-webui.png",
+ links: {
+ github: "https://github.com/open-webui/open-webui",
+ website: "https://openwebui.com/",
+ docs: "https://docs.openwebui.com/",
+ },
+ tags: ["chat"],
+ load: () => import("./open-webui/index").then((m) => m.generate),
+ },
+ {
+ id: "listmonk",
+ name: "Listmonk",
+ version: "v3.0.0",
+ description:
+ "High performance, self-hosted, newsletter and mailing list manager with a modern dashboard.",
+ logo: "listmonk.png",
+ links: {
+ github: "https://github.com/knadh/listmonk",
+ website: "https://listmonk.app/",
+ docs: "https://listmonk.app/docs/",
+ },
+ tags: ["email", "newsletter", "mailing-list"],
+ load: () => import("./listmonk/index").then((m) => m.generate),
+ },
+ {
+ id: "doublezero",
+ name: "Double Zero",
+ version: "v0.2.1",
+ description:
+ "00 is a self hostable SES dashboard for sending and monitoring emails with AWS",
+ logo: "doublezero.svg",
+ links: {
+ github: "https://github.com/technomancy-dev/00",
+ website: "https://www.double-zero.cloud/",
+ docs: "https://github.com/technomancy-dev/00",
+ },
+ tags: ["email"],
+ load: () => import("./doublezero/index").then((m) => m.generate),
+ },
+ {
+ id: "umami",
+ name: "Umami",
+ version: "v2.14.0",
+ description:
+ "Umami is a simple, fast, privacy-focused alternative to Google Analytics.",
+ logo: "umami.png",
+ links: {
+ github: "https://github.com/umami-software/umami",
+ website: "https://umami.is",
+ docs: "https://umami.is/docs",
+ },
+ tags: ["analytics"],
+ load: () => import("./umami/index").then((m) => m.generate),
+ },
+ {
+ id: "jellyfin",
+ name: "jellyfin",
+ version: "v10.9.7",
+ description:
+ "Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. ",
+ logo: "jellyfin.svg",
+ links: {
+ github: "https://github.com/jellyfin/jellyfin",
+ website: "https://jellyfin.org/",
+ docs: "https://jellyfin.org/docs/",
+ },
+ tags: ["media system"],
+ load: () => import("./jellyfin/index").then((m) => m.generate),
+ },
+ {
+ id: "teable",
+ name: "teable",
+ version: "v1.3.1-alpha-build.460",
+ description:
+ "Teable is a Super fast, Real-time, Professional, Developer friendly, No-code database built on Postgres. It uses a simple, spreadsheet-like interface to create complex enterprise-level database applications. Unlock efficient app development with no-code, free from the hurdles of data security and scalability.",
+ logo: "teable.png",
+ links: {
+ github: "https://github.com/teableio/teable",
+ website: "https://teable.io/",
+ docs: "https://help.teable.io/",
+ },
+ tags: ["database", "spreadsheet", "low-code", "nocode"],
+ load: () => import("./teable/index").then((m) => m.generate),
+ },
+ {
+ id: "zipline",
+ name: "Zipline",
+ version: "v3.7.9",
+ description:
+ "A ShareX/file upload server that is easy to use, packed with features, and with an easy setup!",
+ logo: "zipline.png",
+ links: {
+ github: "https://github.com/diced/zipline",
+ website: "https://zipline.diced.sh/",
+ docs: "https://zipline.diced.sh/docs/",
+ },
+ tags: ["media system", "storage"],
+ load: () => import("./zipline/index").then((m) => m.generate),
+ },
+ {
+ id: "soketi",
+ name: "Soketi",
+ version: "v1.6.1-16",
+ description:
+ "Soketi is your simple, fast, and resilient open-source WebSockets server.",
+ logo: "soketi.png",
+ links: {
+ github: "https://github.com/soketi/soketi",
+ website: "https://soketi.app/",
+ docs: "https://docs.soketi.app/",
+ },
+ tags: ["chat"],
+ load: () => import("./soketi/index").then((m) => m.generate),
+ },
+ {
+ id: "aptabase",
+ name: "Aptabase",
+ version: "v1.0.0",
+ description:
+ "Aptabase is a self-hosted web analytics platform that lets you track website traffic and user behavior.",
+ logo: "aptabase.svg",
+ links: {
+ github: "https://github.com/aptabase/aptabase",
+ website: "https://aptabase.com/",
+ docs: "https://github.com/aptabase/aptabase/blob/main/README.md",
+ },
+ tags: ["analytics", "self-hosted"],
+ load: () => import("./aptabase/index").then((m) => m.generate),
+ },
+ {
+ id: "typebot",
+ name: "Typebot",
+ version: "2.27.0",
+ description: "Typebot is an open-source chatbot builder platform.",
+ logo: "typebot.svg",
+ links: {
+ github: "https://github.com/baptisteArno/typebot.io",
+ website: "https://typebot.io/",
+ docs: "https://docs.typebot.io/get-started/introduction",
+ },
+ tags: ["chatbot", "builder", "open-source"],
+ load: () => import("./typebot/index").then((m) => m.generate),
+ },
+ {
+ id: "gitea",
+ name: "Gitea",
+ version: "1.22.3",
+ description:
+ "Git with a cup of tea! Painless self-hosted all-in-one software development service, including Git hosting, code review, team collaboration, package registry and CI/CD.",
+ logo: "gitea.png",
+ links: {
+ github: "https://github.com/go-gitea/gitea.git",
+ website: "https://gitea.com/",
+ docs: "https://docs.gitea.com/installation/install-with-docker",
+ },
+ tags: ["self-hosted", "storage"],
+ load: () => import("./gitea/index").then((m) => m.generate),
+ },
+ {
+ id: "roundcube",
+ name: "Roundcube",
+ version: "1.6.9",
+ description:
+ "Free and open source webmail software for the masses, written in PHP.",
+ logo: "roundcube.svg",
+ links: {
+ github: "https://github.com/roundcube/roundcubemail",
+ website: "https://roundcube.net/",
+ docs: "https://roundcube.net/about/",
+ },
+ tags: ["self-hosted", "email", "webmail"],
+ load: () => import("./roundcube/index").then((m) => m.generate),
+ },
+ {
+ id: "filebrowser",
+ name: "File Browser",
+ version: "2.31.2",
+ description:
+ "Filebrowser is a standalone file manager for uploading, deleting, previewing, renaming, and editing files, with support for multiple users, each with their own directory.",
+ logo: "filebrowser.svg",
+ links: {
+ github: "https://github.com/filebrowser/filebrowser",
+ website: "https://filebrowser.org/",
+ docs: "https://filebrowser.org/",
+ },
+ tags: ["file", "manager"],
+ load: () => import("./filebrowser/index").then((m) => m.generate),
+ },
+ {
+ id: "tolgee",
+ name: "Tolgee",
+ version: "v3.80.4",
+ description:
+ "Developer & translator friendly web-based localization platform",
+ logo: "tolgee.svg",
+ links: {
+ github: "https://github.com/tolgee/tolgee-platform",
+ website: "https://tolgee.io",
+ docs: "https://tolgee.io/platform",
+ },
+ tags: ["self-hosted", "i18n", "localization", "translations"],
+ load: () => import("./tolgee/index").then((m) => m.generate),
+ },
+ {
+ id: "portainer",
+ name: "Portainer",
+ version: "2.21.4",
+ description:
+ "Portainer is a container management tool for deploying, troubleshooting, and securing applications across cloud, data centers, and IoT.",
+ logo: "portainer.svg",
+ links: {
+ github: "https://github.com/portainer/portainer",
+ website: "https://www.portainer.io/",
+ docs: "https://docs.portainer.io/",
+ },
+ tags: ["cloud", "monitoring"],
+ load: () => import("./portainer/index").then((m) => m.generate),
+ },
+ {
+ id: "influxdb",
+ name: "InfluxDB",
+ version: "2.7.10",
+ description:
+ "InfluxDB 2.7 is the platform purpose-built to collect, store, process and visualize time series data.",
+ logo: "influxdb.png",
+ links: {
+ github: "https://github.com/influxdata/influxdb",
+ website: "https://www.influxdata.com/",
+ docs: "https://docs.influxdata.com/influxdb/v2/",
+ },
+ tags: ["self-hosted", "open-source", "storage", "database"],
+ load: () => import("./influxdb/index").then((m) => m.generate),
+ },
+ {
+ id: "infisical",
+ name: "Infisical",
+ version: "0.90.1",
+ description:
+ "All-in-one platform to securely manage application configuration and secrets across your team and infrastructure.",
+ logo: "infisical.jpg",
+ links: {
+ github: "https://github.com/Infisical/infisical",
+ website: "https://infisical.com/",
+ docs: "https://infisical.com/docs/documentation/getting-started/introduction",
+ },
+ tags: ["self-hosted", "open-source"],
+ load: () => import("./infisical/index").then((m) => m.generate),
+ },
+ {
+ id: "docmost",
+ name: "Docmost",
+ version: "0.4.1",
+ description:
+ "Docmost, is an open-source collaborative wiki and documentation software.",
+ logo: "docmost.png",
+ links: {
+ github: "https://github.com/docmost/docmost",
+ website: "https://docmost.com/",
+ docs: "https://docmost.com/docs/",
+ },
+ tags: ["self-hosted", "open-source", "manager"],
+ load: () => import("./docmost/index").then((m) => m.generate),
+ },
+ {
+ id: "vaultwarden",
+ name: "Vaultwarden",
+ version: "1.32.3",
+ description:
+ "Unofficial Bitwarden compatible server written in Rust, formerly known as bitwarden_rs",
+ logo: "vaultwarden.svg",
+ links: {
+ github: "https://github.com/dani-garcia/vaultwarden",
+ website: "",
+ docs: "https://github.com/dani-garcia/vaultwarden/wiki",
+ },
+ tags: ["open-source"],
+ load: () => import("./vaultwarden/index").then((m) => m.generate),
+ },
+ {
+ id: "hi-events",
+ name: "Hi.events",
+ version: "0.8.0-beta.1",
+ description:
+ "Hi.Events is a self-hosted event management and ticket selling platform that allows you to create, manage and promote events easily.",
+ logo: "hi-events.svg",
+ links: {
+ github: "https://github.com/HiEventsDev/hi.events",
+ website: "https://hi.events/",
+ docs: "https://hi.events/docs",
+ },
+ tags: ["self-hosted", "open-source", "manager"],
+ load: () => import("./hi-events/index").then((m) => m.generate),
+ },
+ {
+ id: "windows",
+ name: "Windows (dockerized)",
+ version: "4.00",
+ description: "Windows inside a Docker container.",
+ logo: "windows.png",
+ links: {
+ github: "https://github.com/dockur/windows",
+ website: "",
+ docs: "https://github.com/dockur/windows?tab=readme-ov-file#how-do-i-use-it",
+ },
+ tags: ["self-hosted", "open-source", "os"],
+ load: () => import("./windows/index").then((m) => m.generate),
+ },
+ {
+ id: "macos",
+ name: "MacOS (dockerized)",
+ version: "1.14",
+ description: "MacOS inside a Docker container.",
+ logo: "macos.png",
+ links: {
+ github: "https://github.com/dockur/macos",
+ website: "",
+ docs: "https://github.com/dockur/macos?tab=readme-ov-file#how-do-i-use-it",
+ },
+ tags: ["self-hosted", "open-source", "os"],
+ load: () => import("./macos/index").then((m) => m.generate),
+ },
+ {
+ id: "coder",
+ name: "Coder",
+ version: "2.15.3",
+ description:
+ "Coder is an open-source cloud development environment (CDE) that you host in your cloud or on-premises.",
+ logo: "coder.svg",
+ links: {
+ github: "https://github.com/coder/coder",
+ website: "https://coder.com/",
+ docs: "https://coder.com/docs",
+ },
+ tags: ["self-hosted", "open-source", "builder"],
+ load: () => import("./coder/index").then((m) => m.generate),
+ },
+ {
+ id: "stirling",
+ name: "Stirling PDF",
+ version: "0.30.1",
+ description: "A locally hosted one-stop shop for all your PDF needs",
+ logo: "stirling.svg",
+ links: {
+ github: "https://github.com/Stirling-Tools/Stirling-PDF",
+ website: "https://www.stirlingpdf.com/",
+ docs: "https://docs.stirlingpdf.com/",
+ },
+ tags: ["pdf", "tools"],
+ load: () => import("./stirling/index").then((m) => m.generate),
+ },
+ {
+ id: "lobe-chat",
+ name: "Lobe Chat",
+ version: "v1.26.1",
+ description: "Lobe Chat - an open-source, modern-design AI chat framework.",
+ logo: "lobe-chat.png",
+ links: {
+ github: "https://github.com/lobehub/lobe-chat",
+ website: "https://chat-preview.lobehub.com/",
+ docs: "https://lobehub.com/docs/self-hosting/platform/docker-compose",
+ },
+ tags: ["IA", "chat"],
+ load: () => import("./lobe-chat/index").then((m) => m.generate),
+ },
+ {
+ id: "peppermint",
+ name: "Peppermint",
+ version: "latest",
+ description:
+ "Peppermint is a modern, open-source API development platform that helps you build, test and document your APIs.",
+ logo: "peppermint.svg",
+ links: {
+ github: "https://github.com/Peppermint-Lab/peppermint",
+ website: "https://peppermint.sh/",
+ docs: "https://docs.peppermint.sh/",
+ },
+ tags: ["api", "development", "documentation"],
+ load: () => import("./peppermint/index").then((m) => m.generate),
+ },
+ {
+ id: "windmill",
+ name: "Windmill",
+ version: "latest",
+ description:
+ "A developer platform to build production-grade workflows and internal apps. Open-source alternative to Airplane, Retool, and GitHub Actions.",
+ logo: "windmill.svg",
+ links: {
+ github: "https://github.com/windmill-labs/windmill",
+ website: "https://www.windmill.dev/",
+ docs: "https://docs.windmill.dev/",
+ },
+ tags: ["workflow", "automation", "development"],
+ load: () => import("./windmill/index").then((m) => m.generate),
+ },
+ {
+ id: "activepieces",
+ name: "Activepieces",
+ version: "0.35.0",
+ description:
+ "Open-source no-code business automation tool. An alternative to Zapier, Make.com, and Tray.",
+ logo: "activepieces.svg",
+ links: {
+ github: "https://github.com/activepieces/activepieces",
+ website: "https://www.activepieces.com/",
+ docs: "https://www.activepieces.com/docs",
+ },
+ tags: ["automation", "workflow", "no-code"],
+ load: () => import("./activepieces/index").then((m) => m.generate),
+ },
+ {
+ id: "invoiceshelf",
+ name: "InvoiceShelf",
+ version: "latest",
+ description:
+ "InvoiceShelf is a self-hosted open source invoicing system for freelancers and small businesses.",
+ logo: "invoiceshelf.png",
+ links: {
+ github: "https://github.com/InvoiceShelf/invoiceshelf",
+ website: "https://invoiceshelf.com",
+ docs: "https://github.com/InvoiceShelf/invoiceshelf#readme",
+ },
+ tags: ["invoice", "business", "finance"],
+ load: () => import("./invoiceshelf/index").then((m) => m.generate),
+ },
+ {
+ id: "postiz",
+ name: "Postiz",
+ version: "latest",
+ description:
+ "Postiz is a modern, open-source platform for managing and publishing content across multiple channels.",
+ logo: "postiz.png",
+ links: {
+ github: "https://github.com/gitroomhq/postiz",
+ website: "https://postiz.com",
+ docs: "https://docs.postiz.com",
+ },
+ tags: ["cms", "content-management", "publishing"],
+ load: () => import("./postiz/index").then((m) => m.generate),
+ },
+ {
+ id: "slash",
+ name: "Slash",
+ version: "latest",
+ description:
+ "Slash is a modern, self-hosted bookmarking service and link shortener that helps you organize and share your favorite links.",
+ logo: "slash.png",
+ links: {
+ github: "https://github.com/yourselfhosted/slash",
+ website: "https://github.com/yourselfhosted/slash#readme",
+ docs: "https://github.com/yourselfhosted/slash/wiki",
+ },
+ tags: ["bookmarks", "link-shortener", "self-hosted"],
+ load: () => import("./slash/index").then((m) => m.generate),
+ },
+ {
+ id: "discord-tickets",
+ name: "Discord Tickets",
+ version: "4.0.21",
+ description:
+ "An open-source Discord bot for creating and managing support ticket channels.",
+ logo: "discord-tickets.png",
+ links: {
+ github: "https://github.com/discord-tickets/bot",
+ website: "https://discordtickets.app",
+ docs: "https://discordtickets.app/self-hosting/installation/docker/",
+ },
+ tags: ["discord", "tickets", "support"],
+ load: () => import("./discord-tickets/index").then((m) => m.generate),
+ },
+ {
+ id: "nextcloud-aio",
+ name: "Nextcloud All in One",
+ version: "30.0.2",
+ description:
+ "Nextcloud (AIO) is a self-hosted file storage and sync platform with powerful collaboration capabilities. It integrates Files, Talk, Groupware, Office, Assistant and more into a single platform for remote work and data protection.",
+ logo: "nextcloud-aio.svg",
+ links: {
+ github: "https://github.com/nextcloud/docker",
+ website: "https://nextcloud.com/",
+ docs: "https://docs.nextcloud.com/",
+ },
+ tags: ["file", "sync"],
+ load: () => import("./nextcloud-aio/index").then((m) => m.generate),
+ },
+ {
+ id: "blender",
+ name: "Blender",
+ version: "latest",
+ description:
+ "Blender is a free and open-source 3D creation suite. It supports the entire 3D pipeline—modeling, rigging, animation, simulation, rendering, compositing and motion tracking, video editing and 2D animation pipeline.",
+ logo: "blender.svg",
+ links: {
+ github: "https://github.com/linuxserver/docker-blender",
+ website: "https://www.blender.org/",
+ docs: "https://docs.blender.org/",
+ },
+ tags: ["3d", "rendering", "animation"],
+ load: () => import("./blender/index").then((m) => m.generate),
+ },
+ {
+ id: "heyform",
+ name: "HeyForm",
+ version: "latest",
+ description:
+ "Allows anyone to create engaging conversational forms for surveys, questionnaires, quizzes, and polls. No coding skills required.",
+ logo: "heyform.svg",
+ links: {
+ github: "https://github.com/heyform/heyform",
+ website: "https://heyform.net",
+ docs: "https://docs.heyform.net",
+ },
+ tags: ["form", "builder", "questionnaire", "quiz", "survey"],
+ load: () => import("./heyform/index").then((m) => m.generate),
+ },
+ {
+ id: "chatwoot",
+ name: "Chatwoot",
+ version: "v3.14.1",
+ description:
+ "Open-source customer engagement platform that provides a shared inbox for teams, live chat, and omnichannel support.",
+ logo: "chatwoot.svg",
+ links: {
+ github: "https://github.com/chatwoot/chatwoot",
+ website: "https://www.chatwoot.com",
+ docs: "https://www.chatwoot.com/docs",
+ },
+ tags: ["support", "chat", "customer-service"],
+ load: () => import("./chatwoot/index").then((m) => m.generate),
+ },
+ {
+ id: "discourse",
+ name: "Discourse",
+ version: "3.3.2",
+ description:
+ "Discourse is a modern forum software for your community. Use it as a mailing list, discussion forum, or long-form chat room.",
+ logo: "discourse.svg",
+ links: {
+ github: "https://github.com/discourse/discourse",
+ website: "https://www.discourse.org/",
+ docs: "https://meta.discourse.org/",
+ },
+ tags: ["forum", "community", "discussion"],
+ load: () => import("./discourse/index").then((m) => m.generate),
+ },
+ {
+ id: "immich",
+ name: "Immich",
+ version: "v1.121.0",
+ description:
+ "High performance self-hosted photo and video backup solution directly from your mobile phone.",
+ logo: "immich.svg",
+ links: {
+ github: "https://github.com/immich-app/immich",
+ website: "https://immich.app/",
+ docs: "https://immich.app/docs/overview/introduction",
+ },
+ tags: ["photos", "videos", "backup", "media"],
+ load: () => import("./immich/index").then((m) => m.generate),
+ },
+ {
+ id: "twenty",
+ name: "Twenty CRM",
+ version: "latest",
+ description:
+ "Twenty is a modern CRM offering a powerful spreadsheet interface and open-source alternative to Salesforce.",
+ logo: "twenty.svg",
+ links: {
+ github: "https://github.com/twentyhq/twenty",
+ website: "https://twenty.com",
+ docs: "https://docs.twenty.com",
+ },
+ tags: ["crm", "sales", "business"],
+ load: () => import("./twenty/index").then((m) => m.generate),
+ },
+ {
+ id: "yourls",
+ name: "YOURLS",
+ version: "1.9.2",
+ description:
+ "YOURLS (Your Own URL Shortener) is a set of PHP scripts that will allow you to run your own URL shortening service (a la TinyURL or Bitly).",
+ logo: "yourls.svg",
+ links: {
+ github: "https://github.com/YOURLS/YOURLS",
+ website: "https://yourls.org/",
+ docs: "https://yourls.org/#documentation",
+ },
+ tags: ["url-shortener", "php"],
+ load: () => import("./yourls/index").then((m) => m.generate),
+ },
+ {
+ id: "ryot",
+ name: "Ryot",
+ version: "v7.10",
+ description:
+ "A self-hosted platform for tracking various media types including movies, TV shows, video games, books, audiobooks, and more.",
+ logo: "ryot.png",
+ links: {
+ github: "https://github.com/IgnisDa/ryot",
+ website: "https://ryot.dev/",
+ docs: "https://ryot.dev/docs/getting-started",
+ },
+ tags: ["media", "tracking", "self-hosted"],
+ load: () => import("./ryot/index").then((m) => m.generate),
+ },
+ {
+ id: "photoprism",
+ name: "Photoprism",
+ version: "latest",
+ description:
+ "PhotoPrism® is an AI-Powered Photos App for the Decentralized Web. It makes use of the latest technologies to tag and find pictures automatically without getting in your way.",
+ logo: "photoprism.svg",
+ links: {
+ github: "https://github.com/photoprism/photoprism",
+ website: "https://www.photoprism.app/",
+ docs: "https://docs.photoprism.app/",
+ },
+ tags: ["media", "photos", "self-hosted"],
+ load: () => import("./photoprism/index").then((m) => m.generate),
+ },
+ {
+ id: "ontime",
+ name: "Ontime",
+ version: "v3.8.0",
+ description:
+ "Ontime is browser-based application that manages event rundowns, scheduliing and cuing",
+ logo: "ontime.png",
+ links: {
+ github: "https://github.com/cpvalente/ontime/",
+ website: "https://getontime.no",
+ docs: "https://docs.getontime.no",
+ },
+ tags: ["event"],
+ load: () => import("./ontime/index").then((m) => m.generate),
+ },
+ {
+ id: "triggerdotdev",
+ name: "Trigger.dev",
+ version: "v3",
+ description:
+ "Trigger is a platform for building event-driven applications.",
+ logo: "triggerdotdev.svg",
+ links: {
+ github: "https://github.com/triggerdotdev/trigger.dev",
+ website: "https://trigger.dev/",
+ docs: "https://trigger.dev/docs",
+ },
+ tags: ["event-driven", "applications"],
+ load: () => import("./triggerdotdev/index").then((m) => m.generate),
+ },
];
diff --git a/apps/dokploy/templates/triggerdotdev/index.ts b/apps/dokploy/templates/triggerdotdev/index.ts
index 9a98b46cc..7b894acba 100644
--- a/apps/dokploy/templates/triggerdotdev/index.ts
+++ b/apps/dokploy/templates/triggerdotdev/index.ts
@@ -1,93 +1,93 @@
import { Secrets } from "@/components/ui/secrets";
import {
- type DomainSchema,
- type Schema,
- type Template,
- generateBase64,
- generateRandomDomain,
+ type DomainSchema,
+ type Schema,
+ type Template,
+ generateBase64,
+ generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
- const triggerDomain = generateRandomDomain(schema);
-
- const magicLinkSecret = generateBase64(16);
- const sessionSecret = generateBase64(16);
- const encryptionKey = generateBase64(32);
- const providerSecret = generateBase64(32);
- const coordinatorSecret = generateBase64(32);
-
- const dbPassword = generateBase64(24);
- const dbUser = "triggeruser";
- const dbName = "triggerdb";
-
- const domains: DomainSchema[] = [
- {
- host: triggerDomain,
- port: 3000,
- serviceName: "webapp",
- },
- ];
-
- const envs = [
- `NODE_ENV=production`,
- `RUNTIME_PLATFORM=docker-compose`,
- `V3_ENABLED=true`,
-
- `# Domain configuration`,
- `TRIGGER_DOMAIN=${triggerDomain}`,
- `TRIGGER_PROTOCOL=http`,
-
- `# Database configuration with secure credentials`,
- `POSTGRES_USER=${dbUser}`,
- `POSTGRES_PASSWORD=${dbPassword}`,
- `POSTGRES_DB=${dbName}`,
- `DATABASE_URL=postgresql://${dbUser}:${dbPassword}@postgres:5432/${dbName}`,
-
- `# Secrets`,
- `MAGIC_LINK_SECRET=${magicLinkSecret}`,
- `SESSION_SECRET=${sessionSecret}`,
- `ENCRYPTION_KEY=${encryptionKey}`,
- `PROVIDER_SECRET=${providerSecret}`,
- `COORDINATOR_SECRET=${coordinatorSecret}`,
-
- `# TRIGGER_TELEMETRY_DISABLED=1`,
- `INTERNAL_OTEL_TRACE_DISABLED=1`,
- `INTERNAL_OTEL_TRACE_LOGGING_ENABLED=0`,
-
- `DEFAULT_ORG_EXECUTION_CONCURRENCY_LIMIT=300`,
- `DEFAULT_ENV_EXECUTION_CONCURRENCY_LIMIT=100`,
-
- `DIRECT_URL=\${DATABASE_URL}`,
- `REDIS_HOST=redis`,
- `REDIS_PORT=6379`,
- `REDIS_TLS_DISABLED=true`,
-
- `# If this is set, emails that are not specified won't be able to log in`,
- `# WHITELISTED_EMAILS="authorized@yahoo.com|authorized@gmail.com"`,
- `# Accounts with these emails will become admins when signing up and get access to the admin panel`,
- `# ADMIN_EMAILS="admin@example.com|another-admin@example.com"`,
-
- `# If this is set, your users will be able to log in via GitHub`,
- `# AUTH_GITHUB_CLIENT_ID=`,
- `# AUTH_GITHUB_CLIENT_SECRET=`,
-
- `# E-mail settings`,
- `# Ensure the FROM_EMAIL matches what you setup with Resend.com`,
- `# If these are not set, emails will be printed to the console`,
- `# FROM_EMAIL=`,
- `# REPLY_TO_EMAIL=`,
- `# RESEND_API_KEY=`,
-
- `# Worker settings`,
- `HTTP_SERVER_PORT=9020`,
- `COORDINATOR_HOST=127.0.0.1`,
- `COORDINATOR_PORT=\${HTTP_SERVER_PORT}`,
- `# REGISTRY_HOST=\${DEPLOY_REGISTRY_HOST}`,
- `# REGISTRY_NAMESPACE=\${DEPLOY_REGISTRY_NAMESPACE}`,
- ];
-
- return {
- envs,
- domains,
- };
+ const triggerDomain = generateRandomDomain(schema);
+
+ const magicLinkSecret = generateBase64(16);
+ const sessionSecret = generateBase64(16);
+ const encryptionKey = generateBase64(32);
+ const providerSecret = generateBase64(32);
+ const coordinatorSecret = generateBase64(32);
+
+ const dbPassword = generateBase64(24);
+ const dbUser = "triggeruser";
+ const dbName = "triggerdb";
+
+ const domains: DomainSchema[] = [
+ {
+ host: triggerDomain,
+ port: 3000,
+ serviceName: "webapp",
+ },
+ ];
+
+ const envs = [
+ "NODE_ENV=production",
+ "RUNTIME_PLATFORM=docker-compose",
+ "V3_ENABLED=true",
+
+ "# Domain configuration",
+ `TRIGGER_DOMAIN=${triggerDomain}`,
+ "TRIGGER_PROTOCOL=http",
+
+ "# Database configuration with secure credentials",
+ `POSTGRES_USER=${dbUser}`,
+ `POSTGRES_PASSWORD=${dbPassword}`,
+ `POSTGRES_DB=${dbName}`,
+ `DATABASE_URL=postgresql://${dbUser}:${dbPassword}@postgres:5432/${dbName}`,
+
+ "# Secrets",
+ `MAGIC_LINK_SECRET=${magicLinkSecret}`,
+ `SESSION_SECRET=${sessionSecret}`,
+ `ENCRYPTION_KEY=${encryptionKey}`,
+ `PROVIDER_SECRET=${providerSecret}`,
+ `COORDINATOR_SECRET=${coordinatorSecret}`,
+
+ "# TRIGGER_TELEMETRY_DISABLED=1",
+ "INTERNAL_OTEL_TRACE_DISABLED=1",
+ "INTERNAL_OTEL_TRACE_LOGGING_ENABLED=0",
+
+ "DEFAULT_ORG_EXECUTION_CONCURRENCY_LIMIT=300",
+ "DEFAULT_ENV_EXECUTION_CONCURRENCY_LIMIT=100",
+
+ "DIRECT_URL=${DATABASE_URL}",
+ "REDIS_HOST=redis",
+ "REDIS_PORT=6379",
+ "REDIS_TLS_DISABLED=true",
+
+ "# If this is set, emails that are not specified won't be able to log in",
+ '# WHITELISTED_EMAILS="authorized@yahoo.com|authorized@gmail.com"',
+ "# Accounts with these emails will become admins when signing up and get access to the admin panel",
+ '# ADMIN_EMAILS="admin@example.com|another-admin@example.com"',
+
+ "# If this is set, your users will be able to log in via GitHub",
+ "# AUTH_GITHUB_CLIENT_ID=",
+ "# AUTH_GITHUB_CLIENT_SECRET=",
+
+ "# E-mail settings",
+ "# Ensure the FROM_EMAIL matches what you setup with Resend.com",
+ "# If these are not set, emails will be printed to the console",
+ "# FROM_EMAIL=",
+ "# REPLY_TO_EMAIL=",
+ "# RESEND_API_KEY=",
+
+ "# Worker settings",
+ "HTTP_SERVER_PORT=9020",
+ "COORDINATOR_HOST=127.0.0.1",
+ "COORDINATOR_PORT=${HTTP_SERVER_PORT}",
+ "# REGISTRY_HOST=${DEPLOY_REGISTRY_HOST}",
+ "# REGISTRY_NAMESPACE=${DEPLOY_REGISTRY_NAMESPACE}",
+ ];
+
+ return {
+ envs,
+ domains,
+ };
}
diff --git a/apps/dokploy/utils/hooks/use-locale.ts b/apps/dokploy/utils/hooks/use-locale.ts
index 134418fcf..de979f7bf 100644
--- a/apps/dokploy/utils/hooks/use-locale.ts
+++ b/apps/dokploy/utils/hooks/use-locale.ts
@@ -1,26 +1,10 @@
+import type { Languages } from "@/lib/languages";
import Cookies from "js-cookie";
-const SUPPORTED_LOCALES = [
- "en",
- "pl",
- "ru",
- "fr",
- "de",
- "tr",
- "kz",
- "zh-Hant",
- "zh-Hans",
- "fa",
- "ko",
- "pt-br",
-] as const;
-
-type Locale = (typeof SUPPORTED_LOCALES)[number];
-
export default function useLocale() {
- const currentLocale = (Cookies.get("DOKPLOY_LOCALE") ?? "en") as Locale;
+ const currentLocale = (Cookies.get("DOKPLOY_LOCALE") ?? "en") as Languages;
- const setLocale = (locale: Locale) => {
+ const setLocale = (locale: Languages) => {
Cookies.set("DOKPLOY_LOCALE", locale, { expires: 365 });
window.location.reload();
};
diff --git a/apps/dokploy/utils/i18n.ts b/apps/dokploy/utils/i18n.ts
index 4790f1a70..47466d1f5 100644
--- a/apps/dokploy/utils/i18n.ts
+++ b/apps/dokploy/utils/i18n.ts
@@ -5,11 +5,19 @@ export function getLocale(cookies: NextApiRequestCookies) {
return locale;
}
-// libs/i18n.js
+import { Languages } from "@/lib/languages";
import { serverSideTranslations as originalServerSideTranslations } from "next-i18next/serverSideTranslations";
-import nextI18NextConfig from "../next-i18next.config.cjs";
export const serverSideTranslations = (
locale: string,
namespaces = ["common"],
-) => originalServerSideTranslations(locale, namespaces, nextI18NextConfig);
+) =>
+ originalServerSideTranslations(locale, namespaces, {
+ fallbackLng: "en",
+ keySeparator: false,
+ i18n: {
+ defaultLocale: "en",
+ locales: Object.values(Languages),
+ localeDetection: false,
+ },
+ });
diff --git a/packages/server/src/utils/notifications/database-backup.ts b/packages/server/src/utils/notifications/database-backup.ts
index 115d8b206..717c965f6 100644
--- a/packages/server/src/utils/notifications/database-backup.ts
+++ b/packages/server/src/utils/notifications/database-backup.ts
@@ -95,7 +95,9 @@ export const sendDatabaseBackupNotifications = async ({
},
{
name: "`❓`・Type",
- value: type.replace("error", "Failed").replace("success", "Successful"),
+ value: type
+ .replace("error", "Failed")
+ .replace("success", "Successful"),
inline: true,
},
...(type === "error" && errorMessage
diff --git a/packages/server/src/utils/notifications/docker-cleanup.ts b/packages/server/src/utils/notifications/docker-cleanup.ts
index 31c1c6c9d..e8bbc6dbe 100644
--- a/packages/server/src/utils/notifications/docker-cleanup.ts
+++ b/packages/server/src/utils/notifications/docker-cleanup.ts
@@ -48,7 +48,6 @@ export const sendDockerCleanupNotifications = async (
title: "> `✅` - Docker Cleanup",
color: 0x57f287,
fields: [
-
{
name: "`📅`・Date",
value: date.toLocaleDateString(),