From 609fea7daa28604fe52a1f2f794611a10aca3549 Mon Sep 17 00:00:00 2001 From: vishalkadam47 Date: Thu, 20 Feb 2025 08:35:14 +0530 Subject: [PATCH 01/16] refactor: update glance template --- apps/dokploy/templates/glance/docker-compose.yml | 7 +++++-- apps/dokploy/templates/glance/index.ts | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/dokploy/templates/glance/docker-compose.yml b/apps/dokploy/templates/glance/docker-compose.yml index e931d6e40..ace8bc940 100644 --- a/apps/dokploy/templates/glance/docker-compose.yml +++ b/apps/dokploy/templates/glance/docker-compose.yml @@ -2,7 +2,10 @@ services: glance: image: glanceapp/glance volumes: - - ../files/app/glance.yml:/app/glance.yml + - ../files/app/config/:/app/config + - ../files/app/assets:/app/assets + # Optionally, also mount docker socket if you want to use the docker containers widget + # - /var/run/docker.sock:/var/run/docker.sock:ro ports: - 8080 - restart: unless-stopped + env_file: .env \ No newline at end of file diff --git a/apps/dokploy/templates/glance/index.ts b/apps/dokploy/templates/glance/index.ts index 4b2297864..a0ab1b676 100644 --- a/apps/dokploy/templates/glance/index.ts +++ b/apps/dokploy/templates/glance/index.ts @@ -17,7 +17,7 @@ export function generate(schema: Schema): Template { const mounts: Template["mounts"] = [ { - filePath: "/app/glance.yml", + filePath: "/app/config/glance.yml", content: ` branding: hide-footer: true From c8b1fd36bd47fe53d1d1e6791abe991331963e05 Mon Sep 17 00:00:00 2001 From: Nicholas Penree Date: Wed, 19 Feb 2025 22:27:36 -0500 Subject: [PATCH 02/16] feat: add Mailpit template --- apps/dokploy/public/templates/mailpit.svg | 6 ++++ .../templates/mailpit/docker-compose.yml | 25 +++++++++++++++ apps/dokploy/templates/mailpit/index.ts | 31 +++++++++++++++++++ apps/dokploy/templates/templates.ts | 15 +++++++++ 4 files changed, 77 insertions(+) create mode 100644 apps/dokploy/public/templates/mailpit.svg create mode 100644 apps/dokploy/templates/mailpit/docker-compose.yml create mode 100644 apps/dokploy/templates/mailpit/index.ts diff --git a/apps/dokploy/public/templates/mailpit.svg b/apps/dokploy/public/templates/mailpit.svg new file mode 100644 index 000000000..58675a267 --- /dev/null +++ b/apps/dokploy/public/templates/mailpit.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/apps/dokploy/templates/mailpit/docker-compose.yml b/apps/dokploy/templates/mailpit/docker-compose.yml new file mode 100644 index 000000000..d0dbdb8ec --- /dev/null +++ b/apps/dokploy/templates/mailpit/docker-compose.yml @@ -0,0 +1,25 @@ +services: + mailpit: + image: axllent/mailpit:v1.22.3 + restart: unless-stopped + ports: + - '1025:1025' + volumes: + - 'mailpit-data:/data' + environment: + - MP_SMTP_AUTH_ALLOW_INSECURE=true + - MP_MAX_MESSAGES=5000 + - MP_DATABASE=/data/mailpit.db + - MP_UI_AUTH=${MP_UI_AUTH} + - MP_SMTP_AUTH=${MP_SMTP_AUTH} + healthcheck: + test: + - CMD + - /mailpit + - readyz + interval: 5s + timeout: 20s + retries: 10 + +volumes: + mailpit-data: \ No newline at end of file diff --git a/apps/dokploy/templates/mailpit/index.ts b/apps/dokploy/templates/mailpit/index.ts new file mode 100644 index 000000000..25f18f7e6 --- /dev/null +++ b/apps/dokploy/templates/mailpit/index.ts @@ -0,0 +1,31 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateBase64, + generatePassword, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const domains: DomainSchema[] = [ + { + host: generateRandomDomain(schema), + port: 8025, + serviceName: "mailpit", + }, + ]; + + const defaultPassword = generatePassword(); + + const envs = [ + "# Uncomment below if you want basic auth on UI and SMTP", + `#MP_UI_AUTH=mailpit:${defaultPassword}`, + `#MP_SMTP_AUTH=mailpit:${defaultPassword}`, + ]; + + return { + domains, + envs, + }; +} diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts index 17498e035..29a9b5751 100644 --- a/apps/dokploy/templates/templates.ts +++ b/apps/dokploy/templates/templates.ts @@ -393,6 +393,21 @@ export const templates: TemplateData[] = [ tags: ["chat"], load: () => import("./open-webui/index").then((m) => m.generate), }, + { + id: "mailpit", + name: "Mailpit", + version: "v1.22.3", + description: + "Mailpit is a tiny, self-contained, and secure email & SMTP testing tool with API for developers.", + logo: "mailpit.svg", + links: { + github: "https://github.com/axllent/mailpit", + website: "https://mailpit.axllent.org/", + docs: "https://mailpit.axllent.org/docs/", + }, + tags: ["email", "smtp"], + load: () => import("./mailpit/index").then((m) => m.generate), + }, { id: "listmonk", name: "Listmonk", From baf555af5249e0d5d3e193e6304dc0fe870358f0 Mon Sep 17 00:00:00 2001 From: Cohvir Date: Sat, 22 Feb 2025 14:16:14 +0100 Subject: [PATCH 03/16] feat(template): add Wiki.js --- apps/dokploy/public/templates/wikijs.svg | 119 ++++++++++++++++++ apps/dokploy/templates/templates.ts | 14 +++ .../templates/wikijs/docker-compose.yml | 38 ++++++ apps/dokploy/templates/wikijs/index.ts | 35 ++++++ 4 files changed, 206 insertions(+) create mode 100644 apps/dokploy/public/templates/wikijs.svg create mode 100644 apps/dokploy/templates/wikijs/docker-compose.yml create mode 100644 apps/dokploy/templates/wikijs/index.ts diff --git a/apps/dokploy/public/templates/wikijs.svg b/apps/dokploy/public/templates/wikijs.svg new file mode 100644 index 000000000..78073b234 --- /dev/null +++ b/apps/dokploy/public/templates/wikijs.svg @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts index 31668a6f9..1e18f4acc 100644 --- a/apps/dokploy/templates/templates.ts +++ b/apps/dokploy/templates/templates.ts @@ -1559,4 +1559,18 @@ export const templates: TemplateData[] = [ tags: ["backend", "database", "api"], load: () => import("./convex/index").then((m) => m.generate), }, + { + id: "wikijs", + name: "Wiki.js", + version: "2.5", + description: "The most powerful and extensible open source Wiki software.", + logo: "wikijs.svg", + links: { + github: "https://github.com/requarks/wiki", + website: "https://js.wiki/", + docs: "https://docs.requarks.io/", + }, + tags: ["knowledge-base", "self-hosted", "documentation"], + load: () => import("./wikijs/index").then((m) => m.generate), + }, ]; diff --git a/apps/dokploy/templates/wikijs/docker-compose.yml b/apps/dokploy/templates/wikijs/docker-compose.yml new file mode 100644 index 000000000..132774198 --- /dev/null +++ b/apps/dokploy/templates/wikijs/docker-compose.yml @@ -0,0 +1,38 @@ +version: '3.5' +services: + wiki: + image: ghcr.io/requarks/wiki:2.5 + restart: unless-stopped + ports: + # Change 5000 to the desired port + - "5000:3000" + environment: + - DB_TYPE + - DB_HOST + - DB_PORT + - DB_USER + - DB_PASS + - DB_NAME + depends_on: + - db + networks: + - dokploy-network + labels: + - traefik.enable=true + - traefik.constraint-label-stack=wikijs + db: + image: postgres:14 + restart: unless-stopped + environment: + - POSTGRES_USER + - POSTGRES_PASSWORD + - POSTGRES_DB + volumes: + - wiki-db-data:/var/lib/postgresql/data + networks: + - dokploy-network +networks: + dokploy-network: + external: true +volumes: + wiki-db-data: diff --git a/apps/dokploy/templates/wikijs/index.ts b/apps/dokploy/templates/wikijs/index.ts new file mode 100644 index 000000000..ff6c234de --- /dev/null +++ b/apps/dokploy/templates/wikijs/index.ts @@ -0,0 +1,35 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const domains: DomainSchema[] = [ + { + host: generateRandomDomain(schema), + port: 3000, + serviceName: "wiki", + }, + ]; + + const envs = [ + "# Database Setup", + "POSTGRES_USER=wikijs", + "POSTGRES_PASSWORD=wikijsrocks", + "POSTGRES_DB=wiki", + "# WikiJS Database Connection", + "DB_TYPE=postgres", + "DB_HOST=db", + "DB_PORT=5432", + "DB_USER=wikijs", + "DB_PASS=wikijsrocks", + "DB_NAME=wiki", + ]; + + return { + domains, + envs, + }; +} From 3403f8ab36f5fb27c5b9b9c4087364118e695702 Mon Sep 17 00:00:00 2001 From: Mahad Kalam Date: Sun, 23 Feb 2025 00:47:04 +0000 Subject: [PATCH 04/16] chore: update umami to v2.16.1 --- apps/dokploy/templates/templates.ts | 2 +- apps/dokploy/templates/umami/docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts index 31668a6f9..7ee9a6305 100644 --- a/apps/dokploy/templates/templates.ts +++ b/apps/dokploy/templates/templates.ts @@ -426,7 +426,7 @@ export const templates: TemplateData[] = [ { id: "umami", name: "Umami", - version: "v2.14.0", + version: "v2.16.1", description: "Umami is a simple, fast, privacy-focused alternative to Google Analytics.", logo: "umami.png", diff --git a/apps/dokploy/templates/umami/docker-compose.yml b/apps/dokploy/templates/umami/docker-compose.yml index 875681658..26efd337c 100644 --- a/apps/dokploy/templates/umami/docker-compose.yml +++ b/apps/dokploy/templates/umami/docker-compose.yml @@ -1,6 +1,6 @@ services: umami: - image: ghcr.io/umami-software/umami:postgresql-v2.14.0 + image: ghcr.io/umami-software/umami:postgresql-v2.16.1 restart: always healthcheck: test: ["CMD-SHELL", "curl http://localhost:3000/api/heartbeat"] From 2470d672d404734d4a9e39b2d3683bde25b7401b Mon Sep 17 00:00:00 2001 From: 190km Date: Sun, 23 Feb 2025 01:18:18 +0000 Subject: [PATCH 05/16] fix: fixed highligh search terms color --- .../dashboard/docker/logs/terminal-line.tsx | 57 ++++++++----------- 1 file changed, 23 insertions(+), 34 deletions(-) diff --git a/apps/dokploy/components/dashboard/docker/logs/terminal-line.tsx b/apps/dokploy/components/dashboard/docker/logs/terminal-line.tsx index c25acc67f..116efedf3 100644 --- a/apps/dokploy/components/dashboard/docker/logs/terminal-line.tsx +++ b/apps/dokploy/components/dashboard/docker/logs/terminal-line.tsx @@ -35,45 +35,34 @@ export function TerminalLine({ log, noTimestamp, searchTerm }: LogLineProps) { }) : "--- No time found ---"; - const highlightMessage = (text: string, term: string) => { - if (!term) { + const highlightMessage = (text: string, term: string) => { + if (!term) { + return ( + + ); + } + + const htmlContent = fancyAnsi.toHtml(text); + const searchRegex = new RegExp(`(${escapeRegExp(term)})`, "gi"); + + const modifiedContent = htmlContent.replace( + searchRegex, + (match) => + `${match}`, + ); + return ( ); - } - - const htmlContent = fancyAnsi.toHtml(text); - const modifiedContent = htmlContent.replace( - /]*)>([^<]*)<\/span>/g, - (match, attrs, content) => { - const searchRegex = new RegExp(`(${escapeRegExp(term)})`, "gi"); - if (!content.match(searchRegex)) return match; - - const segments = content.split(searchRegex); - const wrappedSegments = segments - .map((segment: string) => - segment.toLowerCase() === term.toLowerCase() - ? `${segment}` - : segment, - ) - .join(""); - - return `${wrappedSegments}`; - }, - ); - - return ( - - ); - }; + }; const tooltip = (color: string, timestamp: string | null) => { const square = ( From 733f9a002471f4b848ce175fd634b38a7de3980b Mon Sep 17 00:00:00 2001 From: Nicholas Penree Date: Sun, 23 Feb 2025 10:51:50 -0500 Subject: [PATCH 06/16] feat: add Linkwarden template --- apps/dokploy/public/templates/linkwarden.png | Bin 0 -> 80831 bytes .../templates/linkwarden/docker-compose.yml | 40 ++++++++++++++++++ apps/dokploy/templates/linkwarden/index.ts | 33 +++++++++++++++ apps/dokploy/templates/templates.ts | 15 +++++++ 4 files changed, 88 insertions(+) create mode 100644 apps/dokploy/public/templates/linkwarden.png create mode 100644 apps/dokploy/templates/linkwarden/docker-compose.yml create mode 100644 apps/dokploy/templates/linkwarden/index.ts diff --git a/apps/dokploy/public/templates/linkwarden.png b/apps/dokploy/public/templates/linkwarden.png new file mode 100644 index 0000000000000000000000000000000000000000..843f681eb9fe01e745aa4a4d2935b69ebde0c825 GIT binary patch literal 80831 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 BDb)Y~ literal 0 HcmV?d00001 diff --git a/apps/dokploy/templates/linkwarden/docker-compose.yml b/apps/dokploy/templates/linkwarden/docker-compose.yml new file mode 100644 index 000000000..05ffb8a0a --- /dev/null +++ b/apps/dokploy/templates/linkwarden/docker-compose.yml @@ -0,0 +1,40 @@ +services: + linkwarden: + environment: + - NEXTAUTH_SECRET + - NEXTAUTH_URL + - DATABASE_URL=postgresql://linkwarden:${POSTGRES_PASSWORD}@postgres:5432/linkwarden + restart: unless-stopped + image: ghcr.io/linkwarden/linkwarden:v2.9.3 + ports: + - 3000 + volumes: + - linkwarden-data:/data/data + depends_on: + - postgres + healthcheck: + test: curl --fail http://localhost:3000 || exit 1 + interval: 60s + retries: 2 + start_period: 60s + timeout: 15s + + postgres: + image: postgres:17-alpine + restart: unless-stopped + user: postgres + environment: + POSTGRES_USER: linkwarden + POSTGRES_DB: linkwarden + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + - postgres-data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready"] + interval: 10s + timeout: 5s + retries: 5 + +volumes: + linkwarden-data: + postgres-data: diff --git a/apps/dokploy/templates/linkwarden/index.ts b/apps/dokploy/templates/linkwarden/index.ts new file mode 100644 index 000000000..860250356 --- /dev/null +++ b/apps/dokploy/templates/linkwarden/index.ts @@ -0,0 +1,33 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateBase64, + generatePassword, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainDomain = generateRandomDomain(schema); + const postgresPassword = generatePassword(); + const nextSecret = generateBase64(32); + + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 3000, + serviceName: "linkwarden", + }, + ]; + + const envs = [ + `POSTGRES_PASSWORD=${postgresPassword}`, + `NEXTAUTH_SECRET=${nextSecret}`, + `NEXTAUTH_URL=http://${mainDomain}/api/v1/auth`, + ]; + + return { + domains, + envs, + }; +} diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts index 31668a6f9..44d194653 100644 --- a/apps/dokploy/templates/templates.ts +++ b/apps/dokploy/templates/templates.ts @@ -662,6 +662,21 @@ export const templates: TemplateData[] = [ tags: ["open-source"], load: () => import("./vaultwarden/index").then((m) => m.generate), }, + { + id: "linkwarden", + name: "Linkwarden", + version: "2.9.3", + description: + "Self-hosted, open-source collaborative bookmark manager to collect, organize and archive webpages.", + logo: "linkwarden.png", + links: { + github: "https://github.com/linkwarden/linkwarden", + website: "https://linkwarden.app/", + docs: "https://docs.linkwarden.app/", + }, + tags: ["bookmarks", "link-sharing"], + load: () => import("./linkwarden/index").then((m) => m.generate), + }, { id: "hi-events", name: "Hi.events", From 1294c2ad8e176c802f1e9ad87a46e906048d3d3b Mon Sep 17 00:00:00 2001 From: Nicholas Penree Date: Sun, 23 Feb 2025 12:07:54 -0500 Subject: [PATCH 07/16] feat: add Pocket ID template --- apps/dokploy/public/templates/pocket-id.svg | 1 + .../templates/pocket-id/docker-compose.yml | 21 ++++++++++++++ apps/dokploy/templates/pocket-id/index.ts | 29 +++++++++++++++++++ apps/dokploy/templates/templates.ts | 15 ++++++++++ 4 files changed, 66 insertions(+) create mode 100644 apps/dokploy/public/templates/pocket-id.svg create mode 100644 apps/dokploy/templates/pocket-id/docker-compose.yml create mode 100644 apps/dokploy/templates/pocket-id/index.ts diff --git a/apps/dokploy/public/templates/pocket-id.svg b/apps/dokploy/public/templates/pocket-id.svg new file mode 100644 index 000000000..0ee89b14b --- /dev/null +++ b/apps/dokploy/public/templates/pocket-id.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/dokploy/templates/pocket-id/docker-compose.yml b/apps/dokploy/templates/pocket-id/docker-compose.yml new file mode 100644 index 000000000..f93851430 --- /dev/null +++ b/apps/dokploy/templates/pocket-id/docker-compose.yml @@ -0,0 +1,21 @@ +services: + pocket-id: + image: ghcr.io/pocket-id/pocket-id:v0.35.1 + restart: unless-stopped + environment: + - PUBLIC_UI_CONFIG_DISABLED + - PUBLIC_APP_URL + - TRUST_PROXY + ports: + - 80 + volumes: + - pocket-id-data:/app/backend/data + healthcheck: + test: "curl -f http://localhost/health" + interval: 1m30s + timeout: 5s + retries: 2 + start_period: 10s + +volumes: + pocket-id-data: diff --git a/apps/dokploy/templates/pocket-id/index.ts b/apps/dokploy/templates/pocket-id/index.ts new file mode 100644 index 000000000..9a9faa2a3 --- /dev/null +++ b/apps/dokploy/templates/pocket-id/index.ts @@ -0,0 +1,29 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainDomain = generateRandomDomain(schema); + + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 80, + serviceName: "pocket-id", + }, + ]; + + const envs = [ + "PUBLIC_UI_CONFIG_DISABLED=false", + `PUBLIC_APP_URL=http://${mainDomain}`, + "TRUST_PROXY=true", + ]; + + return { + domains, + envs, + }; +} diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts index 31668a6f9..7dafd8565 100644 --- a/apps/dokploy/templates/templates.ts +++ b/apps/dokploy/templates/templates.ts @@ -1093,6 +1093,21 @@ export const templates: TemplateData[] = [ tags: ["identity", "auth"], load: () => import("./logto/index").then((m) => m.generate), }, + { + id: "pocket-id", + name: "Pocket ID", + version: "0.35.1", + description: + "A simple and easy-to-use OIDC provider that allows users to authenticate with their passkeys to your services.", + logo: "pocket-id.svg", + links: { + github: "https://github.com/pocket-id/pocket-id", + website: "https://pocket-id.org/", + docs: "https://pocket-id.org/docs", + }, + tags: ["identity", "auth"], + load: () => import("./pocket-id/index").then((m) => m.generate), + }, { id: "penpot", name: "Penpot", From fb4b5072501ab98d295caa27762ac33e91613cce Mon Sep 17 00:00:00 2001 From: sondreal Date: Sun, 23 Feb 2025 19:03:46 +0100 Subject: [PATCH 08/16] fixes typo outline->getoutline #1352 --- apps/dokploy/templates/templates.ts | 3112 +++++++++++++-------------- 1 file changed, 1556 insertions(+), 1556 deletions(-) diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts index 31668a6f9..6d17532d5 100644 --- a/apps/dokploy/templates/templates.ts +++ b/apps/dokploy/templates/templates.ts @@ -1,1562 +1,1562 @@ import type { TemplateData } from "./types/templates-data.type"; export const templates: TemplateData[] = [ - { - id: "appwrite", - name: "Appwrite", - version: "1.6.0", - description: - "Appwrite is an end-to-end backend server for Web, Mobile, Native, or Backend apps. Appwrite abstracts the complexity and repetitiveness required to build a modern backend API from scratch and allows you to build secure apps faster.\n" + - "Using Appwrite, you can easily integrate your app with user authentication and multiple sign-in methods, a database for storing and querying users and team data, storage and file management, image manipulation, Cloud Functions, messaging, and more services.", - links: { - github: "https://github.com/appwrite/appwrite", - website: "https://appwrite.io/", - docs: "https://appwrite.io/docs", - }, - logo: "appwrite.svg", - tags: ["database", "firebase", "postgres"], - load: () => import("./appwrite/index").then((m) => m.generate), - }, - { - id: "outline", - name: "Outline", - version: "0.82.0", - description: - "Outline is a self-hosted knowledge base and documentation platform that allows you to build and manage your own knowledge base applications.", - links: { - github: "https://github.com/outline/outline", - website: "https://outline.com/", - docs: "https://docs.outline.com/", - }, - logo: "outline.png", - load: () => import("./outline/index").then((m) => m.generate), - tags: ["documentation", "knowledge-base", "self-hosted"], - }, - { - 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.5", - 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: "appwrite", + name: "Appwrite", + version: "1.6.0", + description: + "Appwrite is an end-to-end backend server for Web, Mobile, Native, or Backend apps. Appwrite abstracts the complexity and repetitiveness required to build a modern backend API from scratch and allows you to build secure apps faster.\n" + + "Using Appwrite, you can easily integrate your app with user authentication and multiple sign-in methods, a database for storing and querying users and team data, storage and file management, image manipulation, Cloud Functions, messaging, and more services.", + links: { + github: "https://github.com/appwrite/appwrite", + website: "https://appwrite.io/", + docs: "https://appwrite.io/docs", + }, + logo: "appwrite.svg", + tags: ["database", "firebase", "postgres"], + load: () => import("./appwrite/index").then((m) => m.generate), + }, + { + id: "outline", + name: "Outline", + version: "0.82.0", + description: + "Outline is a self-hosted knowledge base and documentation platform that allows you to build and manage your own knowledge base applications.", + links: { + github: "https://github.com/outline/outline", + website: "https://getoutline.com/", + docs: "https://docs.getoutline.com/s/guide", + }, + logo: "outline.png", + load: () => import("./outline/index").then((m) => m.generate), + tags: ["documentation", "knowledge-base", "self-hosted"], + }, + { + 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.5", + 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: "budibase", - name: "Budibase", - version: "3.2.25", - description: - "Budibase is an open-source low-code platform that saves engineers 100s of hours building forms, portals, and approval apps, securely.", - logo: "budibase.svg", - links: { - github: "https://github.com/Budibase/budibase", - website: "https://budibase.com/", - docs: "https://docs.budibase.com/docs/", - }, - tags: ["database", "low-code", "nocode", "applications"], - load: () => import("./budibase/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.70.3", - 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: "6.7.1", - 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: "budibase", + name: "Budibase", + version: "3.2.25", + description: + "Budibase is an open-source low-code platform that saves engineers 100s of hours building forms, portals, and approval apps, securely.", + logo: "budibase.svg", + links: { + github: "https://github.com/Budibase/budibase", + website: "https://budibase.com/", + docs: "https://docs.budibase.com/docs/", + }, + tags: ["database", "low-code", "nocode", "applications"], + load: () => import("./budibase/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.70.3", + 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: "6.7.1", + 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", "storage"], - 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.7", - 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-manager", "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.io/", - docs: "https://docs.ryot.io/", - }, - 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), - }, - { - id: "browserless", - name: "Browserless", - version: "2.23.0", - description: - "Browserless allows remote clients to connect and execute headless work, all inside of docker. It supports the standard, unforked Puppeteer and Playwright libraries, as well offering REST-based APIs for common actions like data collection, PDF generation and more.", - logo: "browserless.svg", - links: { - github: "https://github.com/browserless/browserless", - website: "https://www.browserless.io/", - docs: "https://docs.browserless.io/", - }, - tags: ["browser", "automation"], - load: () => import("./browserless/index").then((m) => m.generate), - }, - { - id: "drawio", - name: "draw.io", - version: "24.7.17", - description: - "draw.io is a configurable diagramming/whiteboarding visualization application.", - logo: "drawio.svg", - links: { - github: "https://github.com/jgraph/drawio", - website: "https://draw.io/", - docs: "https://www.drawio.com/doc/", - }, - tags: ["drawing", "diagrams"], - load: () => import("./drawio/index").then((m) => m.generate), - }, - { - id: "kimai", - name: "Kimai", - version: "2.26.0", - description: - "Kimai is a web-based multi-user time-tracking application. Works great for everyone: freelancers, companies, organizations - everyone can track their times, generate reports, create invoices and do so much more.", - logo: "kimai.svg", - links: { - github: "https://github.com/kimai/kimai", - website: "https://www.kimai.org", - docs: "https://www.kimai.org/documentation", - }, - tags: ["invoice", "business", "finance"], - load: () => import("./kimai/index").then((m) => m.generate), - }, - { - id: "logto", - name: "Logto", - version: "1.22.0", - description: - "Logto is an open-source Identity and Access Management (IAM) platform designed to streamline Customer Identity and Access Management (CIAM) and Workforce Identity Management.", - logo: "logto.png", - links: { - github: "https://github.com/logto-io/logto", - website: "https://logto.io/", - docs: "https://docs.logto.io/introduction", - }, - tags: ["identity", "auth"], - load: () => import("./logto/index").then((m) => m.generate), - }, - { - id: "penpot", - name: "Penpot", - version: "2.3.2", - description: - "Penpot is the web-based open-source design tool that bridges the gap between designers and developers.", - logo: "penpot.svg", - links: { - github: "https://github.com/penpot/penpot", - website: "https://penpot.app/", - docs: "https://docs.penpot.app/", - }, - tags: ["design", "collaboration"], - load: () => import("./penpot/index").then((m) => m.generate), - }, - { - id: "huly", - name: "Huly", - version: "0.6.377", - description: - "Huly — All-in-One Project Management Platform (alternative to Linear, Jira, Slack, Notion, Motion)", - logo: "huly.svg", - links: { - github: "https://github.com/hcengineering/huly-selfhost", - website: "https://huly.io/", - docs: "https://docs.huly.io/", - }, - tags: ["project-management", "community", "discussion"], - load: () => import("./huly/index").then((m) => m.generate), - }, - { - id: "unsend", - name: "Unsend", - version: "v1.3.2", - description: "Open source alternative to Resend,Sendgrid, Postmark etc. ", - logo: "unsend.png", - links: { - github: "https://github.com/unsend-dev/unsend", - website: "https://unsend.dev/", - docs: "https://docs.unsend.dev/get-started/", - }, - tags: ["e-mail", "marketing", "business"], - load: () => import("./unsend/index").then((m) => m.generate), - }, - { - id: "langflow", - name: "Langflow", - version: "1.1.1", - description: - "Langflow is a low-code app builder for RAG and multi-agent AI applications. It’s Python-based and agnostic to any model, API, or database. ", - logo: "langflow.svg", - links: { - github: "https://github.com/langflow-ai/langflow/tree/main", - website: "https://www.langflow.org/", - docs: "https://docs.langflow.org/", - }, - tags: ["ai"], - load: () => import("./langflow/index").then((m) => m.generate), - }, - { - id: "elastic-search", - name: "Elasticsearch", - version: "8.10.2", - description: - "Elasticsearch is an open-source search and analytics engine, used for full-text search and analytics on structured data such as text, web pages, images, and videos.", - logo: "elasticsearch.svg", - links: { - github: "https://github.com/elastic/elasticsearch", - website: "https://www.elastic.co/elasticsearch/", - docs: "https://docs.elastic.co/elasticsearch/", - }, - tags: ["search", "analytics"], - load: () => import("./elastic-search/index").then((m) => m.generate), - }, - { - id: "onedev", - name: "OneDev", - version: "11.6.6", - description: - "Git server with CI/CD, kanban, and packages. Seamless integration. Unparalleled experience.", - logo: "onedev.png", - links: { - github: "https://github.com/theonedev/onedev/", - website: "https://onedev.io/", - docs: "https://docs.onedev.io/", - }, - tags: ["self-hosted", "development"], - load: () => import("./onedev/index").then((m) => m.generate), - }, - { - id: "unifi", - name: "Unifi Network", - version: "11.6.6", - description: - "Unifi Network is an open-source enterprise network management platform for wireless networks.", - logo: "unifi.webp", - links: { - github: "https://github.com/ubiquiti", - website: "https://www.ui.com/", - docs: "https://help.ui.com/hc/en-us/articles/360012282453-Self-Hosting-a-UniFi-Network-Server", - }, - tags: ["self-hosted", "networking"], - load: () => import("./unifi/index").then((m) => m.generate), - }, - { - id: "glpi", - name: "GLPI Project", - version: "10.0.16", - description: "The most complete open source service management software", - logo: "glpi.webp", - links: { - github: "https://github.com/glpi-project/glpi", - website: "https://glpi-project.org/", - docs: "https://glpi-project.org/documentation/", - }, - tags: ["self-hosted", "project-management", "management"], - load: () => import("./glpi/index").then((m) => m.generate), - }, - { - id: "checkmate", - name: "Checkmate", - version: "2.0.1", - description: - "Checkmate is an open-source, self-hosted tool designed to track and monitor server hardware, uptime, response times, and incidents in real-time with beautiful visualizations.", - logo: "checkmate.png", - links: { - github: "https://github.com/bluewave-labs/checkmate", - website: "https://bluewavelabs.ca", - docs: "https://bluewavelabs.gitbook.io/checkmate", - }, - tags: ["self-hosted", "monitoring", "uptime"], - load: () => import("./checkmate/index").then((m) => m.generate), - }, - { - id: "gotenberg", - name: "Gotenberg", - version: "latest", - description: "Gotenberg is a Docker-powered stateless API for PDF files.", - logo: "gotenberg.png", - links: { - github: "https://github.com/gotenberg/gotenberg", - website: "https://gotenberg.dev", - docs: "https://gotenberg.dev/docs/getting-started/introduction", - }, - tags: ["api", "backend", "pdf", "tools"], - load: () => import("./gotenberg/index").then((m) => m.generate), - }, - { - id: "actualbudget", - name: "Actual Budget", - version: "latest", - description: - "A super fast and privacy-focused app for managing your finances.", - logo: "actualbudget.png", - links: { - github: "https://github.com/actualbudget/actual", - website: "https://actualbudget.org", - docs: "https://actualbudget.org/docs", - }, - tags: ["budgeting", "finance", "money"], - load: () => import("./actualbudget/index").then((m) => m.generate), - }, - { - id: "conduit", - name: "Conduit", - version: "v0.9.0", - description: - "Conduit is a simple, fast and reliable chat server powered by Matrix", - logo: "conduit.svg", - links: { - github: "https://gitlab.com/famedly/conduit", - website: "https://conduit.rs/", - docs: "https://docs.conduit.rs/", - }, - tags: ["matrix", "communication"], - load: () => import("./conduit/index").then((m) => m.generate), - }, - { - id: "evolutionapi", - name: "Evolution API", - version: "v2.1.2", - description: - "Evolution API is a robust platform dedicated to empowering small businesses with limited resources, going beyond a simple messaging solution via WhatsApp.", - logo: "evolutionapi.png", - links: { - github: "https://github.com/EvolutionAPI/evolution-api", - docs: "https://doc.evolution-api.com/v2/en/get-started/introduction", - website: "https://evolution-api.com/opensource-whatsapp-api/", - }, - tags: ["api", "whatsapp", "messaging"], - load: () => import("./evolutionapi/index").then((m) => m.generate), - }, - { - id: "conduwuit", - name: "Conduwuit", - version: "latest", - description: - "Well-maintained, featureful Matrix chat homeserver (fork of Conduit)", - logo: "conduwuit.svg", - links: { - github: "https://github.com/girlbossceo/conduwuit", - website: "https://conduwuit.puppyirl.gay", - docs: "https://conduwuit.puppyirl.gay/configuration.html", - }, - tags: ["backend", "chat", "communication", "matrix", "server"], - load: () => import("./conduwuit/index").then((m) => m.generate), - }, - { - id: "cloudflared", - name: "Cloudflared", - version: "latest", - description: - "A lightweight daemon that securely connects local services to the internet through Cloudflare Tunnel.", - logo: "cloudflared.svg", - links: { - github: "https://github.com/cloudflare/cloudflared", - website: - "https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/", - docs: "https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/", - }, - tags: ["cloud", "networking", "security", "tunnel"], - load: () => import("./cloudflared/index").then((m) => m.generate), - }, - { - id: "couchdb", - name: "CouchDB", - version: "latest", - description: - "CouchDB is a document-oriented NoSQL database that excels at replication and horizontal scaling.", - logo: "couchdb.png", - links: { - github: "https://github.com/apache/couchdb", - website: "https://couchdb.apache.org/", - docs: "https://docs.couchdb.org/en/stable/", - }, - tags: ["database", "storage"], - load: () => import("./couchdb/index").then((m) => m.generate), - }, - { - id: "it-tools", - name: "IT Tools", - version: "latest", - description: "A collection of handy online it-tools for developers.", - logo: "it-tools.svg", - links: { - github: "https://github.com/CorentinTh/it-tools", - website: "https://it-tools.tech", - }, - tags: ["developer", "tools"], - load: () => import("./it-tools/index").then((m) => m.generate), - }, - { - id: "superset", - name: "Superset (Unofficial)", - version: "latest", - description: "Data visualization and data exploration platform.", - logo: "superset.svg", - links: { - github: "https://github.com/amancevice/docker-superset", - website: "https://superset.apache.org", - docs: "https://superset.apache.org/docs/intro", - }, - tags: ["analytics", "bi", "dashboard", "database", "sql"], - load: () => import("./superset/index").then((m) => m.generate), - }, - { - id: "glance", - name: "Glance", - version: "latest", - description: - "A self-hosted dashboard that puts all your feeds in one place. Features RSS feeds, weather, bookmarks, site monitoring, and more in a minimal, fast interface.", - logo: "glance.png", - links: { - github: "https://github.com/glanceapp/glance", - docs: "https://github.com/glanceapp/glance/blob/main/docs/configuration.md", - }, - tags: ["dashboard", "monitoring", "widgets", "rss"], - load: () => import("./glance/index").then((m) => m.generate), - }, - { - id: "homarr", - name: "Homarr", - version: "latest", - description: - "A sleek, modern dashboard that puts all your apps and services in one place with Docker integration.", - logo: "homarr.png", - links: { - github: "https://github.com/homarr-labs/homarr", - docs: "https://homarr.dev/docs/getting-started/installation/docker", - website: "https://homarr.dev/", - }, - tags: ["dashboard", "monitoring"], - load: () => import("./homarr/index").then((m) => m.generate), - }, - { - id: "erpnext", - name: "ERPNext", - version: "version-15", - description: "100% Open Source and highly customizable ERP software.", - logo: "erpnext.svg", - links: { - github: "https://github.com/frappe/erpnext", - docs: "https://docs.frappe.io/erpnext", - website: "https://erpnext.com", - }, - tags: [ - "erp", - "accounts", - "manufacturing", - "retail", - "sales", - "pos", - "hrms", - ], - load: () => import("./erpnext/index").then((m) => m.generate), - }, - { - id: "maybe", - name: "Maybe", - version: "latest", - description: - "Maybe is a self-hosted finance tracking application designed to simplify budgeting and expenses.", - logo: "maybe.svg", - links: { - github: "https://github.com/maybe-finance/maybe", - website: "https://maybe.finance/", - docs: "https://docs.maybe.finance/", - }, - tags: ["finance", "self-hosted"], - load: () => import("./maybe/index").then((m) => m.generate), - }, - { - id: "spacedrive", - name: "Spacedrive", - version: "latest", - description: - "Spacedrive is a cross-platform file manager. It connects your devices together to help you organize files from anywhere. powered by a virtual distributed filesystem (VDFS) written in Rust. Organize files across many devices in one place.", - links: { - github: "https://github.com/spacedriveapp/spacedrive", - website: "https://spacedrive.com/", - docs: "https://www.spacedrive.com/docs/product/getting-started/introduction", - }, - logo: "spacedrive.png", - tags: ["file-manager", "vdfs", "storage"], - load: () => import("./spacedrive/index").then((m) => m.generate), - }, - { - id: "registry", - name: "Docker Registry", - version: "2", - description: - "Distribution implementation for storing and distributing of Docker container images and artifacts.", - links: { - github: "https://github.com/distribution/distribution", - website: "https://hub.docker.com/_/registry", - docs: "https://distribution.github.io/distribution/", - }, - logo: "registry.png", - tags: ["registry", "docker", "self-hosted"], - load: () => import("./registry/index").then((m) => m.generate), - }, - { - id: "alist", - name: "AList", - version: "v3.41.0", - description: - "🗂️A file list/WebDAV program that supports multiple storages, powered by Gin and Solidjs.", - logo: "alist.svg", - links: { - github: "https://github.com/AlistGo/alist", - website: "https://alist.nn.ci", - docs: "https://alist.nn.ci/guide/install/docker.html", - }, - tags: ["file", "webdav", "storage"], - load: () => import("./alist/index").then((m) => m.generate), - }, - { - id: "answer", - name: "Answer", - version: "v1.4.1", - description: - "Answer is an open-source Q&A platform for building a self-hosted question-and-answer service.", - logo: "answer.png", - links: { - github: "https://github.com/apache/answer", - website: "https://answer.apache.org/", - docs: "https://answer.apache.org/docs", - }, - tags: ["q&a", "self-hosted"], - load: () => import("./answer/index").then((m) => m.generate), - }, - { - id: "shlink", - name: "Shlink", - version: "stable", - description: - "URL shortener that can be used to serve shortened URLs under your own domain.", - logo: "shlink.svg", - links: { - github: "https://github.com/shlinkio/shlink", - website: "https://shlink.io", - docs: "https://shlink.io/documentation", - }, - tags: ["sharing", "shortener", "url"], - load: () => import("./shlink/index").then((m) => m.generate), - }, - { - id: "frappe-hr", - name: "Frappe HR", - version: "version-15", - description: - "Feature rich HR & Payroll software. 100% FOSS and customizable.", - logo: "frappe-hr.svg", - links: { - github: "https://github.com/frappe/hrms", - docs: "https://docs.frappe.io/hr", - website: "https://frappe.io/hr", - }, - tags: ["hrms", "payroll", "leaves", "expenses", "attendance", "performace"], - load: () => import("./frappe-hr/index").then((m) => m.generate), - }, - { - id: "formbricks", - name: "Formbricks", - version: "v3.1.3", - description: - "Formbricks is an open-source survey and form platform for collecting user data.", - logo: "formbricks.png", - links: { - github: "https://github.com/formbricks/formbricks", - website: "https://formbricks.com/", - docs: "https://formbricks.com/docs", - }, - tags: ["forms", "analytics"], - load: () => import("./formbricks/index").then((m) => m.generate), - }, - { - id: "trilium", - name: "Trilium", - description: - "Trilium Notes is a hierarchical note taking application with focus on building large personal knowledge bases.", - logo: "trilium.png", - version: "latest", - links: { - github: "https://github.com/zadam/trilium", - website: "https://github.com/zadam/trilium", - docs: "https://github.com/zadam/trilium/wiki/", - }, - tags: ["self-hosted", "productivity", "personal-use"], - load: () => import("./trilium/index").then((m) => m.generate), - }, - { - id: "convex", - name: "Convex", - version: "latest", - description: - "Convex is an open-source reactive database designed to make life easy for web app developers.", - logo: "convex.svg", - links: { - github: "https://github.com/get-convex/convex", - website: "https://www.convex.dev/", - docs: "https://www.convex.dev/docs", - }, - tags: ["backend", "database", "api"], - load: () => import("./convex/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", "storage"], + 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.7", + 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-manager", "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.io/", + docs: "https://docs.ryot.io/", + }, + 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), + }, + { + id: "browserless", + name: "Browserless", + version: "2.23.0", + description: + "Browserless allows remote clients to connect and execute headless work, all inside of docker. It supports the standard, unforked Puppeteer and Playwright libraries, as well offering REST-based APIs for common actions like data collection, PDF generation and more.", + logo: "browserless.svg", + links: { + github: "https://github.com/browserless/browserless", + website: "https://www.browserless.io/", + docs: "https://docs.browserless.io/", + }, + tags: ["browser", "automation"], + load: () => import("./browserless/index").then((m) => m.generate), + }, + { + id: "drawio", + name: "draw.io", + version: "24.7.17", + description: + "draw.io is a configurable diagramming/whiteboarding visualization application.", + logo: "drawio.svg", + links: { + github: "https://github.com/jgraph/drawio", + website: "https://draw.io/", + docs: "https://www.drawio.com/doc/", + }, + tags: ["drawing", "diagrams"], + load: () => import("./drawio/index").then((m) => m.generate), + }, + { + id: "kimai", + name: "Kimai", + version: "2.26.0", + description: + "Kimai is a web-based multi-user time-tracking application. Works great for everyone: freelancers, companies, organizations - everyone can track their times, generate reports, create invoices and do so much more.", + logo: "kimai.svg", + links: { + github: "https://github.com/kimai/kimai", + website: "https://www.kimai.org", + docs: "https://www.kimai.org/documentation", + }, + tags: ["invoice", "business", "finance"], + load: () => import("./kimai/index").then((m) => m.generate), + }, + { + id: "logto", + name: "Logto", + version: "1.22.0", + description: + "Logto is an open-source Identity and Access Management (IAM) platform designed to streamline Customer Identity and Access Management (CIAM) and Workforce Identity Management.", + logo: "logto.png", + links: { + github: "https://github.com/logto-io/logto", + website: "https://logto.io/", + docs: "https://docs.logto.io/introduction", + }, + tags: ["identity", "auth"], + load: () => import("./logto/index").then((m) => m.generate), + }, + { + id: "penpot", + name: "Penpot", + version: "2.3.2", + description: + "Penpot is the web-based open-source design tool that bridges the gap between designers and developers.", + logo: "penpot.svg", + links: { + github: "https://github.com/penpot/penpot", + website: "https://penpot.app/", + docs: "https://docs.penpot.app/", + }, + tags: ["design", "collaboration"], + load: () => import("./penpot/index").then((m) => m.generate), + }, + { + id: "huly", + name: "Huly", + version: "0.6.377", + description: + "Huly — All-in-One Project Management Platform (alternative to Linear, Jira, Slack, Notion, Motion)", + logo: "huly.svg", + links: { + github: "https://github.com/hcengineering/huly-selfhost", + website: "https://huly.io/", + docs: "https://docs.huly.io/", + }, + tags: ["project-management", "community", "discussion"], + load: () => import("./huly/index").then((m) => m.generate), + }, + { + id: "unsend", + name: "Unsend", + version: "v1.3.2", + description: "Open source alternative to Resend,Sendgrid, Postmark etc. ", + logo: "unsend.png", + links: { + github: "https://github.com/unsend-dev/unsend", + website: "https://unsend.dev/", + docs: "https://docs.unsend.dev/get-started/", + }, + tags: ["e-mail", "marketing", "business"], + load: () => import("./unsend/index").then((m) => m.generate), + }, + { + id: "langflow", + name: "Langflow", + version: "1.1.1", + description: + "Langflow is a low-code app builder for RAG and multi-agent AI applications. It’s Python-based and agnostic to any model, API, or database. ", + logo: "langflow.svg", + links: { + github: "https://github.com/langflow-ai/langflow/tree/main", + website: "https://www.langflow.org/", + docs: "https://docs.langflow.org/", + }, + tags: ["ai"], + load: () => import("./langflow/index").then((m) => m.generate), + }, + { + id: "elastic-search", + name: "Elasticsearch", + version: "8.10.2", + description: + "Elasticsearch is an open-source search and analytics engine, used for full-text search and analytics on structured data such as text, web pages, images, and videos.", + logo: "elasticsearch.svg", + links: { + github: "https://github.com/elastic/elasticsearch", + website: "https://www.elastic.co/elasticsearch/", + docs: "https://docs.elastic.co/elasticsearch/", + }, + tags: ["search", "analytics"], + load: () => import("./elastic-search/index").then((m) => m.generate), + }, + { + id: "onedev", + name: "OneDev", + version: "11.6.6", + description: + "Git server with CI/CD, kanban, and packages. Seamless integration. Unparalleled experience.", + logo: "onedev.png", + links: { + github: "https://github.com/theonedev/onedev/", + website: "https://onedev.io/", + docs: "https://docs.onedev.io/", + }, + tags: ["self-hosted", "development"], + load: () => import("./onedev/index").then((m) => m.generate), + }, + { + id: "unifi", + name: "Unifi Network", + version: "11.6.6", + description: + "Unifi Network is an open-source enterprise network management platform for wireless networks.", + logo: "unifi.webp", + links: { + github: "https://github.com/ubiquiti", + website: "https://www.ui.com/", + docs: "https://help.ui.com/hc/en-us/articles/360012282453-Self-Hosting-a-UniFi-Network-Server", + }, + tags: ["self-hosted", "networking"], + load: () => import("./unifi/index").then((m) => m.generate), + }, + { + id: "glpi", + name: "GLPI Project", + version: "10.0.16", + description: "The most complete open source service management software", + logo: "glpi.webp", + links: { + github: "https://github.com/glpi-project/glpi", + website: "https://glpi-project.org/", + docs: "https://glpi-project.org/documentation/", + }, + tags: ["self-hosted", "project-management", "management"], + load: () => import("./glpi/index").then((m) => m.generate), + }, + { + id: "checkmate", + name: "Checkmate", + version: "2.0.1", + description: + "Checkmate is an open-source, self-hosted tool designed to track and monitor server hardware, uptime, response times, and incidents in real-time with beautiful visualizations.", + logo: "checkmate.png", + links: { + github: "https://github.com/bluewave-labs/checkmate", + website: "https://bluewavelabs.ca", + docs: "https://bluewavelabs.gitbook.io/checkmate", + }, + tags: ["self-hosted", "monitoring", "uptime"], + load: () => import("./checkmate/index").then((m) => m.generate), + }, + { + id: "gotenberg", + name: "Gotenberg", + version: "latest", + description: "Gotenberg is a Docker-powered stateless API for PDF files.", + logo: "gotenberg.png", + links: { + github: "https://github.com/gotenberg/gotenberg", + website: "https://gotenberg.dev", + docs: "https://gotenberg.dev/docs/getting-started/introduction", + }, + tags: ["api", "backend", "pdf", "tools"], + load: () => import("./gotenberg/index").then((m) => m.generate), + }, + { + id: "actualbudget", + name: "Actual Budget", + version: "latest", + description: + "A super fast and privacy-focused app for managing your finances.", + logo: "actualbudget.png", + links: { + github: "https://github.com/actualbudget/actual", + website: "https://actualbudget.org", + docs: "https://actualbudget.org/docs", + }, + tags: ["budgeting", "finance", "money"], + load: () => import("./actualbudget/index").then((m) => m.generate), + }, + { + id: "conduit", + name: "Conduit", + version: "v0.9.0", + description: + "Conduit is a simple, fast and reliable chat server powered by Matrix", + logo: "conduit.svg", + links: { + github: "https://gitlab.com/famedly/conduit", + website: "https://conduit.rs/", + docs: "https://docs.conduit.rs/", + }, + tags: ["matrix", "communication"], + load: () => import("./conduit/index").then((m) => m.generate), + }, + { + id: "evolutionapi", + name: "Evolution API", + version: "v2.1.2", + description: + "Evolution API is a robust platform dedicated to empowering small businesses with limited resources, going beyond a simple messaging solution via WhatsApp.", + logo: "evolutionapi.png", + links: { + github: "https://github.com/EvolutionAPI/evolution-api", + docs: "https://doc.evolution-api.com/v2/en/get-started/introduction", + website: "https://evolution-api.com/opensource-whatsapp-api/", + }, + tags: ["api", "whatsapp", "messaging"], + load: () => import("./evolutionapi/index").then((m) => m.generate), + }, + { + id: "conduwuit", + name: "Conduwuit", + version: "latest", + description: + "Well-maintained, featureful Matrix chat homeserver (fork of Conduit)", + logo: "conduwuit.svg", + links: { + github: "https://github.com/girlbossceo/conduwuit", + website: "https://conduwuit.puppyirl.gay", + docs: "https://conduwuit.puppyirl.gay/configuration.html", + }, + tags: ["backend", "chat", "communication", "matrix", "server"], + load: () => import("./conduwuit/index").then((m) => m.generate), + }, + { + id: "cloudflared", + name: "Cloudflared", + version: "latest", + description: + "A lightweight daemon that securely connects local services to the internet through Cloudflare Tunnel.", + logo: "cloudflared.svg", + links: { + github: "https://github.com/cloudflare/cloudflared", + website: + "https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/", + docs: "https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/", + }, + tags: ["cloud", "networking", "security", "tunnel"], + load: () => import("./cloudflared/index").then((m) => m.generate), + }, + { + id: "couchdb", + name: "CouchDB", + version: "latest", + description: + "CouchDB is a document-oriented NoSQL database that excels at replication and horizontal scaling.", + logo: "couchdb.png", + links: { + github: "https://github.com/apache/couchdb", + website: "https://couchdb.apache.org/", + docs: "https://docs.couchdb.org/en/stable/", + }, + tags: ["database", "storage"], + load: () => import("./couchdb/index").then((m) => m.generate), + }, + { + id: "it-tools", + name: "IT Tools", + version: "latest", + description: "A collection of handy online it-tools for developers.", + logo: "it-tools.svg", + links: { + github: "https://github.com/CorentinTh/it-tools", + website: "https://it-tools.tech", + }, + tags: ["developer", "tools"], + load: () => import("./it-tools/index").then((m) => m.generate), + }, + { + id: "superset", + name: "Superset (Unofficial)", + version: "latest", + description: "Data visualization and data exploration platform.", + logo: "superset.svg", + links: { + github: "https://github.com/amancevice/docker-superset", + website: "https://superset.apache.org", + docs: "https://superset.apache.org/docs/intro", + }, + tags: ["analytics", "bi", "dashboard", "database", "sql"], + load: () => import("./superset/index").then((m) => m.generate), + }, + { + id: "glance", + name: "Glance", + version: "latest", + description: + "A self-hosted dashboard that puts all your feeds in one place. Features RSS feeds, weather, bookmarks, site monitoring, and more in a minimal, fast interface.", + logo: "glance.png", + links: { + github: "https://github.com/glanceapp/glance", + docs: "https://github.com/glanceapp/glance/blob/main/docs/configuration.md", + }, + tags: ["dashboard", "monitoring", "widgets", "rss"], + load: () => import("./glance/index").then((m) => m.generate), + }, + { + id: "homarr", + name: "Homarr", + version: "latest", + description: + "A sleek, modern dashboard that puts all your apps and services in one place with Docker integration.", + logo: "homarr.png", + links: { + github: "https://github.com/homarr-labs/homarr", + docs: "https://homarr.dev/docs/getting-started/installation/docker", + website: "https://homarr.dev/", + }, + tags: ["dashboard", "monitoring"], + load: () => import("./homarr/index").then((m) => m.generate), + }, + { + id: "erpnext", + name: "ERPNext", + version: "version-15", + description: "100% Open Source and highly customizable ERP software.", + logo: "erpnext.svg", + links: { + github: "https://github.com/frappe/erpnext", + docs: "https://docs.frappe.io/erpnext", + website: "https://erpnext.com", + }, + tags: [ + "erp", + "accounts", + "manufacturing", + "retail", + "sales", + "pos", + "hrms", + ], + load: () => import("./erpnext/index").then((m) => m.generate), + }, + { + id: "maybe", + name: "Maybe", + version: "latest", + description: + "Maybe is a self-hosted finance tracking application designed to simplify budgeting and expenses.", + logo: "maybe.svg", + links: { + github: "https://github.com/maybe-finance/maybe", + website: "https://maybe.finance/", + docs: "https://docs.maybe.finance/", + }, + tags: ["finance", "self-hosted"], + load: () => import("./maybe/index").then((m) => m.generate), + }, + { + id: "spacedrive", + name: "Spacedrive", + version: "latest", + description: + "Spacedrive is a cross-platform file manager. It connects your devices together to help you organize files from anywhere. powered by a virtual distributed filesystem (VDFS) written in Rust. Organize files across many devices in one place.", + links: { + github: "https://github.com/spacedriveapp/spacedrive", + website: "https://spacedrive.com/", + docs: "https://www.spacedrive.com/docs/product/getting-started/introduction", + }, + logo: "spacedrive.png", + tags: ["file-manager", "vdfs", "storage"], + load: () => import("./spacedrive/index").then((m) => m.generate), + }, + { + id: "registry", + name: "Docker Registry", + version: "2", + description: + "Distribution implementation for storing and distributing of Docker container images and artifacts.", + links: { + github: "https://github.com/distribution/distribution", + website: "https://hub.docker.com/_/registry", + docs: "https://distribution.github.io/distribution/", + }, + logo: "registry.png", + tags: ["registry", "docker", "self-hosted"], + load: () => import("./registry/index").then((m) => m.generate), + }, + { + id: "alist", + name: "AList", + version: "v3.41.0", + description: + "🗂️A file list/WebDAV program that supports multiple storages, powered by Gin and Solidjs.", + logo: "alist.svg", + links: { + github: "https://github.com/AlistGo/alist", + website: "https://alist.nn.ci", + docs: "https://alist.nn.ci/guide/install/docker.html", + }, + tags: ["file", "webdav", "storage"], + load: () => import("./alist/index").then((m) => m.generate), + }, + { + id: "answer", + name: "Answer", + version: "v1.4.1", + description: + "Answer is an open-source Q&A platform for building a self-hosted question-and-answer service.", + logo: "answer.png", + links: { + github: "https://github.com/apache/answer", + website: "https://answer.apache.org/", + docs: "https://answer.apache.org/docs", + }, + tags: ["q&a", "self-hosted"], + load: () => import("./answer/index").then((m) => m.generate), + }, + { + id: "shlink", + name: "Shlink", + version: "stable", + description: + "URL shortener that can be used to serve shortened URLs under your own domain.", + logo: "shlink.svg", + links: { + github: "https://github.com/shlinkio/shlink", + website: "https://shlink.io", + docs: "https://shlink.io/documentation", + }, + tags: ["sharing", "shortener", "url"], + load: () => import("./shlink/index").then((m) => m.generate), + }, + { + id: "frappe-hr", + name: "Frappe HR", + version: "version-15", + description: + "Feature rich HR & Payroll software. 100% FOSS and customizable.", + logo: "frappe-hr.svg", + links: { + github: "https://github.com/frappe/hrms", + docs: "https://docs.frappe.io/hr", + website: "https://frappe.io/hr", + }, + tags: ["hrms", "payroll", "leaves", "expenses", "attendance", "performace"], + load: () => import("./frappe-hr/index").then((m) => m.generate), + }, + { + id: "formbricks", + name: "Formbricks", + version: "v3.1.3", + description: + "Formbricks is an open-source survey and form platform for collecting user data.", + logo: "formbricks.png", + links: { + github: "https://github.com/formbricks/formbricks", + website: "https://formbricks.com/", + docs: "https://formbricks.com/docs", + }, + tags: ["forms", "analytics"], + load: () => import("./formbricks/index").then((m) => m.generate), + }, + { + id: "trilium", + name: "Trilium", + description: + "Trilium Notes is a hierarchical note taking application with focus on building large personal knowledge bases.", + logo: "trilium.png", + version: "latest", + links: { + github: "https://github.com/zadam/trilium", + website: "https://github.com/zadam/trilium", + docs: "https://github.com/zadam/trilium/wiki/", + }, + tags: ["self-hosted", "productivity", "personal-use"], + load: () => import("./trilium/index").then((m) => m.generate), + }, + { + id: "convex", + name: "Convex", + version: "latest", + description: + "Convex is an open-source reactive database designed to make life easy for web app developers.", + logo: "convex.svg", + links: { + github: "https://github.com/get-convex/convex", + website: "https://www.convex.dev/", + docs: "https://www.convex.dev/docs", + }, + tags: ["backend", "database", "api"], + load: () => import("./convex/index").then((m) => m.generate), + }, ]; From 0b7996addec5dc7966ae042133487be8a44728e8 Mon Sep 17 00:00:00 2001 From: sondreal Date: Sun, 23 Feb 2025 19:13:42 +0100 Subject: [PATCH 09/16] removed my linting --- apps/dokploy/templates/templates.ts | 3114 +++++++++++++-------------- 1 file changed, 1557 insertions(+), 1557 deletions(-) diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts index 6d17532d5..b488cbdeb 100644 --- a/apps/dokploy/templates/templates.ts +++ b/apps/dokploy/templates/templates.ts @@ -1,1562 +1,1562 @@ import type { TemplateData } from "./types/templates-data.type"; export const templates: TemplateData[] = [ - { - id: "appwrite", - name: "Appwrite", - version: "1.6.0", - description: - "Appwrite is an end-to-end backend server for Web, Mobile, Native, or Backend apps. Appwrite abstracts the complexity and repetitiveness required to build a modern backend API from scratch and allows you to build secure apps faster.\n" + - "Using Appwrite, you can easily integrate your app with user authentication and multiple sign-in methods, a database for storing and querying users and team data, storage and file management, image manipulation, Cloud Functions, messaging, and more services.", - links: { - github: "https://github.com/appwrite/appwrite", - website: "https://appwrite.io/", - docs: "https://appwrite.io/docs", - }, - logo: "appwrite.svg", - tags: ["database", "firebase", "postgres"], - load: () => import("./appwrite/index").then((m) => m.generate), - }, - { - id: "outline", - name: "Outline", - version: "0.82.0", - description: - "Outline is a self-hosted knowledge base and documentation platform that allows you to build and manage your own knowledge base applications.", - links: { - github: "https://github.com/outline/outline", - website: "https://getoutline.com/", - docs: "https://docs.getoutline.com/s/guide", - }, - logo: "outline.png", - load: () => import("./outline/index").then((m) => m.generate), - tags: ["documentation", "knowledge-base", "self-hosted"], - }, - { - 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.5", - 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: "appwrite", + name: "Appwrite", + version: "1.6.0", + description: + "Appwrite is an end-to-end backend server for Web, Mobile, Native, or Backend apps. Appwrite abstracts the complexity and repetitiveness required to build a modern backend API from scratch and allows you to build secure apps faster.\n" + + "Using Appwrite, you can easily integrate your app with user authentication and multiple sign-in methods, a database for storing and querying users and team data, storage and file management, image manipulation, Cloud Functions, messaging, and more services.", + links: { + github: "https://github.com/appwrite/appwrite", + website: "https://appwrite.io/", + docs: "https://appwrite.io/docs", + }, + logo: "appwrite.svg", + tags: ["database", "firebase", "postgres"], + load: () => import("./appwrite/index").then((m) => m.generate), + }, + { + id: "outline", + name: "Outline", + version: "0.82.0", + description: + "Outline is a self-hosted knowledge base and documentation platform that allows you to build and manage your own knowledge base applications.", + links: { + github: "https://github.com/outline/outline", + website: "https://outline.com/", + docs: "https://docs.outline.com/", + }, + logo: "outline.png", + load: () => import("./outline/index").then((m) => m.generate), + tags: ["documentation", "knowledge-base", "self-hosted"], + }, + { + 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.5", + 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: "budibase", - name: "Budibase", - version: "3.2.25", - description: - "Budibase is an open-source low-code platform that saves engineers 100s of hours building forms, portals, and approval apps, securely.", - logo: "budibase.svg", - links: { - github: "https://github.com/Budibase/budibase", - website: "https://budibase.com/", - docs: "https://docs.budibase.com/docs/", - }, - tags: ["database", "low-code", "nocode", "applications"], - load: () => import("./budibase/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.70.3", - 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: "6.7.1", - 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: "budibase", + name: "Budibase", + version: "3.2.25", + description: + "Budibase is an open-source low-code platform that saves engineers 100s of hours building forms, portals, and approval apps, securely.", + logo: "budibase.svg", + links: { + github: "https://github.com/Budibase/budibase", + website: "https://budibase.com/", + docs: "https://docs.budibase.com/docs/", + }, + tags: ["database", "low-code", "nocode", "applications"], + load: () => import("./budibase/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.70.3", + 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: "6.7.1", + 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", "storage"], - 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.7", - 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-manager", "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.io/", - docs: "https://docs.ryot.io/", - }, - 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), - }, - { - id: "browserless", - name: "Browserless", - version: "2.23.0", - description: - "Browserless allows remote clients to connect and execute headless work, all inside of docker. It supports the standard, unforked Puppeteer and Playwright libraries, as well offering REST-based APIs for common actions like data collection, PDF generation and more.", - logo: "browserless.svg", - links: { - github: "https://github.com/browserless/browserless", - website: "https://www.browserless.io/", - docs: "https://docs.browserless.io/", - }, - tags: ["browser", "automation"], - load: () => import("./browserless/index").then((m) => m.generate), - }, - { - id: "drawio", - name: "draw.io", - version: "24.7.17", - description: - "draw.io is a configurable diagramming/whiteboarding visualization application.", - logo: "drawio.svg", - links: { - github: "https://github.com/jgraph/drawio", - website: "https://draw.io/", - docs: "https://www.drawio.com/doc/", - }, - tags: ["drawing", "diagrams"], - load: () => import("./drawio/index").then((m) => m.generate), - }, - { - id: "kimai", - name: "Kimai", - version: "2.26.0", - description: - "Kimai is a web-based multi-user time-tracking application. Works great for everyone: freelancers, companies, organizations - everyone can track their times, generate reports, create invoices and do so much more.", - logo: "kimai.svg", - links: { - github: "https://github.com/kimai/kimai", - website: "https://www.kimai.org", - docs: "https://www.kimai.org/documentation", - }, - tags: ["invoice", "business", "finance"], - load: () => import("./kimai/index").then((m) => m.generate), - }, - { - id: "logto", - name: "Logto", - version: "1.22.0", - description: - "Logto is an open-source Identity and Access Management (IAM) platform designed to streamline Customer Identity and Access Management (CIAM) and Workforce Identity Management.", - logo: "logto.png", - links: { - github: "https://github.com/logto-io/logto", - website: "https://logto.io/", - docs: "https://docs.logto.io/introduction", - }, - tags: ["identity", "auth"], - load: () => import("./logto/index").then((m) => m.generate), - }, - { - id: "penpot", - name: "Penpot", - version: "2.3.2", - description: - "Penpot is the web-based open-source design tool that bridges the gap between designers and developers.", - logo: "penpot.svg", - links: { - github: "https://github.com/penpot/penpot", - website: "https://penpot.app/", - docs: "https://docs.penpot.app/", - }, - tags: ["design", "collaboration"], - load: () => import("./penpot/index").then((m) => m.generate), - }, - { - id: "huly", - name: "Huly", - version: "0.6.377", - description: - "Huly — All-in-One Project Management Platform (alternative to Linear, Jira, Slack, Notion, Motion)", - logo: "huly.svg", - links: { - github: "https://github.com/hcengineering/huly-selfhost", - website: "https://huly.io/", - docs: "https://docs.huly.io/", - }, - tags: ["project-management", "community", "discussion"], - load: () => import("./huly/index").then((m) => m.generate), - }, - { - id: "unsend", - name: "Unsend", - version: "v1.3.2", - description: "Open source alternative to Resend,Sendgrid, Postmark etc. ", - logo: "unsend.png", - links: { - github: "https://github.com/unsend-dev/unsend", - website: "https://unsend.dev/", - docs: "https://docs.unsend.dev/get-started/", - }, - tags: ["e-mail", "marketing", "business"], - load: () => import("./unsend/index").then((m) => m.generate), - }, - { - id: "langflow", - name: "Langflow", - version: "1.1.1", - description: - "Langflow is a low-code app builder for RAG and multi-agent AI applications. It’s Python-based and agnostic to any model, API, or database. ", - logo: "langflow.svg", - links: { - github: "https://github.com/langflow-ai/langflow/tree/main", - website: "https://www.langflow.org/", - docs: "https://docs.langflow.org/", - }, - tags: ["ai"], - load: () => import("./langflow/index").then((m) => m.generate), - }, - { - id: "elastic-search", - name: "Elasticsearch", - version: "8.10.2", - description: - "Elasticsearch is an open-source search and analytics engine, used for full-text search and analytics on structured data such as text, web pages, images, and videos.", - logo: "elasticsearch.svg", - links: { - github: "https://github.com/elastic/elasticsearch", - website: "https://www.elastic.co/elasticsearch/", - docs: "https://docs.elastic.co/elasticsearch/", - }, - tags: ["search", "analytics"], - load: () => import("./elastic-search/index").then((m) => m.generate), - }, - { - id: "onedev", - name: "OneDev", - version: "11.6.6", - description: - "Git server with CI/CD, kanban, and packages. Seamless integration. Unparalleled experience.", - logo: "onedev.png", - links: { - github: "https://github.com/theonedev/onedev/", - website: "https://onedev.io/", - docs: "https://docs.onedev.io/", - }, - tags: ["self-hosted", "development"], - load: () => import("./onedev/index").then((m) => m.generate), - }, - { - id: "unifi", - name: "Unifi Network", - version: "11.6.6", - description: - "Unifi Network is an open-source enterprise network management platform for wireless networks.", - logo: "unifi.webp", - links: { - github: "https://github.com/ubiquiti", - website: "https://www.ui.com/", - docs: "https://help.ui.com/hc/en-us/articles/360012282453-Self-Hosting-a-UniFi-Network-Server", - }, - tags: ["self-hosted", "networking"], - load: () => import("./unifi/index").then((m) => m.generate), - }, - { - id: "glpi", - name: "GLPI Project", - version: "10.0.16", - description: "The most complete open source service management software", - logo: "glpi.webp", - links: { - github: "https://github.com/glpi-project/glpi", - website: "https://glpi-project.org/", - docs: "https://glpi-project.org/documentation/", - }, - tags: ["self-hosted", "project-management", "management"], - load: () => import("./glpi/index").then((m) => m.generate), - }, - { - id: "checkmate", - name: "Checkmate", - version: "2.0.1", - description: - "Checkmate is an open-source, self-hosted tool designed to track and monitor server hardware, uptime, response times, and incidents in real-time with beautiful visualizations.", - logo: "checkmate.png", - links: { - github: "https://github.com/bluewave-labs/checkmate", - website: "https://bluewavelabs.ca", - docs: "https://bluewavelabs.gitbook.io/checkmate", - }, - tags: ["self-hosted", "monitoring", "uptime"], - load: () => import("./checkmate/index").then((m) => m.generate), - }, - { - id: "gotenberg", - name: "Gotenberg", - version: "latest", - description: "Gotenberg is a Docker-powered stateless API for PDF files.", - logo: "gotenberg.png", - links: { - github: "https://github.com/gotenberg/gotenberg", - website: "https://gotenberg.dev", - docs: "https://gotenberg.dev/docs/getting-started/introduction", - }, - tags: ["api", "backend", "pdf", "tools"], - load: () => import("./gotenberg/index").then((m) => m.generate), - }, - { - id: "actualbudget", - name: "Actual Budget", - version: "latest", - description: - "A super fast and privacy-focused app for managing your finances.", - logo: "actualbudget.png", - links: { - github: "https://github.com/actualbudget/actual", - website: "https://actualbudget.org", - docs: "https://actualbudget.org/docs", - }, - tags: ["budgeting", "finance", "money"], - load: () => import("./actualbudget/index").then((m) => m.generate), - }, - { - id: "conduit", - name: "Conduit", - version: "v0.9.0", - description: - "Conduit is a simple, fast and reliable chat server powered by Matrix", - logo: "conduit.svg", - links: { - github: "https://gitlab.com/famedly/conduit", - website: "https://conduit.rs/", - docs: "https://docs.conduit.rs/", - }, - tags: ["matrix", "communication"], - load: () => import("./conduit/index").then((m) => m.generate), - }, - { - id: "evolutionapi", - name: "Evolution API", - version: "v2.1.2", - description: - "Evolution API is a robust platform dedicated to empowering small businesses with limited resources, going beyond a simple messaging solution via WhatsApp.", - logo: "evolutionapi.png", - links: { - github: "https://github.com/EvolutionAPI/evolution-api", - docs: "https://doc.evolution-api.com/v2/en/get-started/introduction", - website: "https://evolution-api.com/opensource-whatsapp-api/", - }, - tags: ["api", "whatsapp", "messaging"], - load: () => import("./evolutionapi/index").then((m) => m.generate), - }, - { - id: "conduwuit", - name: "Conduwuit", - version: "latest", - description: - "Well-maintained, featureful Matrix chat homeserver (fork of Conduit)", - logo: "conduwuit.svg", - links: { - github: "https://github.com/girlbossceo/conduwuit", - website: "https://conduwuit.puppyirl.gay", - docs: "https://conduwuit.puppyirl.gay/configuration.html", - }, - tags: ["backend", "chat", "communication", "matrix", "server"], - load: () => import("./conduwuit/index").then((m) => m.generate), - }, - { - id: "cloudflared", - name: "Cloudflared", - version: "latest", - description: - "A lightweight daemon that securely connects local services to the internet through Cloudflare Tunnel.", - logo: "cloudflared.svg", - links: { - github: "https://github.com/cloudflare/cloudflared", - website: - "https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/", - docs: "https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/", - }, - tags: ["cloud", "networking", "security", "tunnel"], - load: () => import("./cloudflared/index").then((m) => m.generate), - }, - { - id: "couchdb", - name: "CouchDB", - version: "latest", - description: - "CouchDB is a document-oriented NoSQL database that excels at replication and horizontal scaling.", - logo: "couchdb.png", - links: { - github: "https://github.com/apache/couchdb", - website: "https://couchdb.apache.org/", - docs: "https://docs.couchdb.org/en/stable/", - }, - tags: ["database", "storage"], - load: () => import("./couchdb/index").then((m) => m.generate), - }, - { - id: "it-tools", - name: "IT Tools", - version: "latest", - description: "A collection of handy online it-tools for developers.", - logo: "it-tools.svg", - links: { - github: "https://github.com/CorentinTh/it-tools", - website: "https://it-tools.tech", - }, - tags: ["developer", "tools"], - load: () => import("./it-tools/index").then((m) => m.generate), - }, - { - id: "superset", - name: "Superset (Unofficial)", - version: "latest", - description: "Data visualization and data exploration platform.", - logo: "superset.svg", - links: { - github: "https://github.com/amancevice/docker-superset", - website: "https://superset.apache.org", - docs: "https://superset.apache.org/docs/intro", - }, - tags: ["analytics", "bi", "dashboard", "database", "sql"], - load: () => import("./superset/index").then((m) => m.generate), - }, - { - id: "glance", - name: "Glance", - version: "latest", - description: - "A self-hosted dashboard that puts all your feeds in one place. Features RSS feeds, weather, bookmarks, site monitoring, and more in a minimal, fast interface.", - logo: "glance.png", - links: { - github: "https://github.com/glanceapp/glance", - docs: "https://github.com/glanceapp/glance/blob/main/docs/configuration.md", - }, - tags: ["dashboard", "monitoring", "widgets", "rss"], - load: () => import("./glance/index").then((m) => m.generate), - }, - { - id: "homarr", - name: "Homarr", - version: "latest", - description: - "A sleek, modern dashboard that puts all your apps and services in one place with Docker integration.", - logo: "homarr.png", - links: { - github: "https://github.com/homarr-labs/homarr", - docs: "https://homarr.dev/docs/getting-started/installation/docker", - website: "https://homarr.dev/", - }, - tags: ["dashboard", "monitoring"], - load: () => import("./homarr/index").then((m) => m.generate), - }, - { - id: "erpnext", - name: "ERPNext", - version: "version-15", - description: "100% Open Source and highly customizable ERP software.", - logo: "erpnext.svg", - links: { - github: "https://github.com/frappe/erpnext", - docs: "https://docs.frappe.io/erpnext", - website: "https://erpnext.com", - }, - tags: [ - "erp", - "accounts", - "manufacturing", - "retail", - "sales", - "pos", - "hrms", - ], - load: () => import("./erpnext/index").then((m) => m.generate), - }, - { - id: "maybe", - name: "Maybe", - version: "latest", - description: - "Maybe is a self-hosted finance tracking application designed to simplify budgeting and expenses.", - logo: "maybe.svg", - links: { - github: "https://github.com/maybe-finance/maybe", - website: "https://maybe.finance/", - docs: "https://docs.maybe.finance/", - }, - tags: ["finance", "self-hosted"], - load: () => import("./maybe/index").then((m) => m.generate), - }, - { - id: "spacedrive", - name: "Spacedrive", - version: "latest", - description: - "Spacedrive is a cross-platform file manager. It connects your devices together to help you organize files from anywhere. powered by a virtual distributed filesystem (VDFS) written in Rust. Organize files across many devices in one place.", - links: { - github: "https://github.com/spacedriveapp/spacedrive", - website: "https://spacedrive.com/", - docs: "https://www.spacedrive.com/docs/product/getting-started/introduction", - }, - logo: "spacedrive.png", - tags: ["file-manager", "vdfs", "storage"], - load: () => import("./spacedrive/index").then((m) => m.generate), - }, - { - id: "registry", - name: "Docker Registry", - version: "2", - description: - "Distribution implementation for storing and distributing of Docker container images and artifacts.", - links: { - github: "https://github.com/distribution/distribution", - website: "https://hub.docker.com/_/registry", - docs: "https://distribution.github.io/distribution/", - }, - logo: "registry.png", - tags: ["registry", "docker", "self-hosted"], - load: () => import("./registry/index").then((m) => m.generate), - }, - { - id: "alist", - name: "AList", - version: "v3.41.0", - description: - "🗂️A file list/WebDAV program that supports multiple storages, powered by Gin and Solidjs.", - logo: "alist.svg", - links: { - github: "https://github.com/AlistGo/alist", - website: "https://alist.nn.ci", - docs: "https://alist.nn.ci/guide/install/docker.html", - }, - tags: ["file", "webdav", "storage"], - load: () => import("./alist/index").then((m) => m.generate), - }, - { - id: "answer", - name: "Answer", - version: "v1.4.1", - description: - "Answer is an open-source Q&A platform for building a self-hosted question-and-answer service.", - logo: "answer.png", - links: { - github: "https://github.com/apache/answer", - website: "https://answer.apache.org/", - docs: "https://answer.apache.org/docs", - }, - tags: ["q&a", "self-hosted"], - load: () => import("./answer/index").then((m) => m.generate), - }, - { - id: "shlink", - name: "Shlink", - version: "stable", - description: - "URL shortener that can be used to serve shortened URLs under your own domain.", - logo: "shlink.svg", - links: { - github: "https://github.com/shlinkio/shlink", - website: "https://shlink.io", - docs: "https://shlink.io/documentation", - }, - tags: ["sharing", "shortener", "url"], - load: () => import("./shlink/index").then((m) => m.generate), - }, - { - id: "frappe-hr", - name: "Frappe HR", - version: "version-15", - description: - "Feature rich HR & Payroll software. 100% FOSS and customizable.", - logo: "frappe-hr.svg", - links: { - github: "https://github.com/frappe/hrms", - docs: "https://docs.frappe.io/hr", - website: "https://frappe.io/hr", - }, - tags: ["hrms", "payroll", "leaves", "expenses", "attendance", "performace"], - load: () => import("./frappe-hr/index").then((m) => m.generate), - }, - { - id: "formbricks", - name: "Formbricks", - version: "v3.1.3", - description: - "Formbricks is an open-source survey and form platform for collecting user data.", - logo: "formbricks.png", - links: { - github: "https://github.com/formbricks/formbricks", - website: "https://formbricks.com/", - docs: "https://formbricks.com/docs", - }, - tags: ["forms", "analytics"], - load: () => import("./formbricks/index").then((m) => m.generate), - }, - { - id: "trilium", - name: "Trilium", - description: - "Trilium Notes is a hierarchical note taking application with focus on building large personal knowledge bases.", - logo: "trilium.png", - version: "latest", - links: { - github: "https://github.com/zadam/trilium", - website: "https://github.com/zadam/trilium", - docs: "https://github.com/zadam/trilium/wiki/", - }, - tags: ["self-hosted", "productivity", "personal-use"], - load: () => import("./trilium/index").then((m) => m.generate), - }, - { - id: "convex", - name: "Convex", - version: "latest", - description: - "Convex is an open-source reactive database designed to make life easy for web app developers.", - logo: "convex.svg", - links: { - github: "https://github.com/get-convex/convex", - website: "https://www.convex.dev/", - docs: "https://www.convex.dev/docs", - }, - tags: ["backend", "database", "api"], - load: () => import("./convex/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", "storage"], + 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.7", + 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-manager", "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.io/", + docs: "https://docs.ryot.io/", + }, + 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), + }, + { + id: "browserless", + name: "Browserless", + version: "2.23.0", + description: + "Browserless allows remote clients to connect and execute headless work, all inside of docker. It supports the standard, unforked Puppeteer and Playwright libraries, as well offering REST-based APIs for common actions like data collection, PDF generation and more.", + logo: "browserless.svg", + links: { + github: "https://github.com/browserless/browserless", + website: "https://www.browserless.io/", + docs: "https://docs.browserless.io/", + }, + tags: ["browser", "automation"], + load: () => import("./browserless/index").then((m) => m.generate), + }, + { + id: "drawio", + name: "draw.io", + version: "24.7.17", + description: + "draw.io is a configurable diagramming/whiteboarding visualization application.", + logo: "drawio.svg", + links: { + github: "https://github.com/jgraph/drawio", + website: "https://draw.io/", + docs: "https://www.drawio.com/doc/", + }, + tags: ["drawing", "diagrams"], + load: () => import("./drawio/index").then((m) => m.generate), + }, + { + id: "kimai", + name: "Kimai", + version: "2.26.0", + description: + "Kimai is a web-based multi-user time-tracking application. Works great for everyone: freelancers, companies, organizations - everyone can track their times, generate reports, create invoices and do so much more.", + logo: "kimai.svg", + links: { + github: "https://github.com/kimai/kimai", + website: "https://www.kimai.org", + docs: "https://www.kimai.org/documentation", + }, + tags: ["invoice", "business", "finance"], + load: () => import("./kimai/index").then((m) => m.generate), + }, + { + id: "logto", + name: "Logto", + version: "1.22.0", + description: + "Logto is an open-source Identity and Access Management (IAM) platform designed to streamline Customer Identity and Access Management (CIAM) and Workforce Identity Management.", + logo: "logto.png", + links: { + github: "https://github.com/logto-io/logto", + website: "https://logto.io/", + docs: "https://docs.logto.io/introduction", + }, + tags: ["identity", "auth"], + load: () => import("./logto/index").then((m) => m.generate), + }, + { + id: "penpot", + name: "Penpot", + version: "2.3.2", + description: + "Penpot is the web-based open-source design tool that bridges the gap between designers and developers.", + logo: "penpot.svg", + links: { + github: "https://github.com/penpot/penpot", + website: "https://penpot.app/", + docs: "https://docs.penpot.app/", + }, + tags: ["design", "collaboration"], + load: () => import("./penpot/index").then((m) => m.generate), + }, + { + id: "huly", + name: "Huly", + version: "0.6.377", + description: + "Huly — All-in-One Project Management Platform (alternative to Linear, Jira, Slack, Notion, Motion)", + logo: "huly.svg", + links: { + github: "https://github.com/hcengineering/huly-selfhost", + website: "https://huly.io/", + docs: "https://docs.huly.io/", + }, + tags: ["project-management", "community", "discussion"], + load: () => import("./huly/index").then((m) => m.generate), + }, + { + id: "unsend", + name: "Unsend", + version: "v1.3.2", + description: "Open source alternative to Resend,Sendgrid, Postmark etc. ", + logo: "unsend.png", + links: { + github: "https://github.com/unsend-dev/unsend", + website: "https://unsend.dev/", + docs: "https://docs.unsend.dev/get-started/", + }, + tags: ["e-mail", "marketing", "business"], + load: () => import("./unsend/index").then((m) => m.generate), + }, + { + id: "langflow", + name: "Langflow", + version: "1.1.1", + description: + "Langflow is a low-code app builder for RAG and multi-agent AI applications. It’s Python-based and agnostic to any model, API, or database. ", + logo: "langflow.svg", + links: { + github: "https://github.com/langflow-ai/langflow/tree/main", + website: "https://www.langflow.org/", + docs: "https://docs.langflow.org/", + }, + tags: ["ai"], + load: () => import("./langflow/index").then((m) => m.generate), + }, + { + id: "elastic-search", + name: "Elasticsearch", + version: "8.10.2", + description: + "Elasticsearch is an open-source search and analytics engine, used for full-text search and analytics on structured data such as text, web pages, images, and videos.", + logo: "elasticsearch.svg", + links: { + github: "https://github.com/elastic/elasticsearch", + website: "https://www.elastic.co/elasticsearch/", + docs: "https://docs.elastic.co/elasticsearch/", + }, + tags: ["search", "analytics"], + load: () => import("./elastic-search/index").then((m) => m.generate), + }, + { + id: "onedev", + name: "OneDev", + version: "11.6.6", + description: + "Git server with CI/CD, kanban, and packages. Seamless integration. Unparalleled experience.", + logo: "onedev.png", + links: { + github: "https://github.com/theonedev/onedev/", + website: "https://onedev.io/", + docs: "https://docs.onedev.io/", + }, + tags: ["self-hosted", "development"], + load: () => import("./onedev/index").then((m) => m.generate), + }, + { + id: "unifi", + name: "Unifi Network", + version: "11.6.6", + description: + "Unifi Network is an open-source enterprise network management platform for wireless networks.", + logo: "unifi.webp", + links: { + github: "https://github.com/ubiquiti", + website: "https://www.ui.com/", + docs: "https://help.ui.com/hc/en-us/articles/360012282453-Self-Hosting-a-UniFi-Network-Server", + }, + tags: ["self-hosted", "networking"], + load: () => import("./unifi/index").then((m) => m.generate), + }, + { + id: "glpi", + name: "GLPI Project", + version: "10.0.16", + description: "The most complete open source service management software", + logo: "glpi.webp", + links: { + github: "https://github.com/glpi-project/glpi", + website: "https://glpi-project.org/", + docs: "https://glpi-project.org/documentation/", + }, + tags: ["self-hosted", "project-management", "management"], + load: () => import("./glpi/index").then((m) => m.generate), + }, + { + id: "checkmate", + name: "Checkmate", + version: "2.0.1", + description: + "Checkmate is an open-source, self-hosted tool designed to track and monitor server hardware, uptime, response times, and incidents in real-time with beautiful visualizations.", + logo: "checkmate.png", + links: { + github: "https://github.com/bluewave-labs/checkmate", + website: "https://bluewavelabs.ca", + docs: "https://bluewavelabs.gitbook.io/checkmate", + }, + tags: ["self-hosted", "monitoring", "uptime"], + load: () => import("./checkmate/index").then((m) => m.generate), + }, + { + id: "gotenberg", + name: "Gotenberg", + version: "latest", + description: "Gotenberg is a Docker-powered stateless API for PDF files.", + logo: "gotenberg.png", + links: { + github: "https://github.com/gotenberg/gotenberg", + website: "https://gotenberg.dev", + docs: "https://gotenberg.dev/docs/getting-started/introduction", + }, + tags: ["api", "backend", "pdf", "tools"], + load: () => import("./gotenberg/index").then((m) => m.generate), + }, + { + id: "actualbudget", + name: "Actual Budget", + version: "latest", + description: + "A super fast and privacy-focused app for managing your finances.", + logo: "actualbudget.png", + links: { + github: "https://github.com/actualbudget/actual", + website: "https://actualbudget.org", + docs: "https://actualbudget.org/docs", + }, + tags: ["budgeting", "finance", "money"], + load: () => import("./actualbudget/index").then((m) => m.generate), + }, + { + id: "conduit", + name: "Conduit", + version: "v0.9.0", + description: + "Conduit is a simple, fast and reliable chat server powered by Matrix", + logo: "conduit.svg", + links: { + github: "https://gitlab.com/famedly/conduit", + website: "https://conduit.rs/", + docs: "https://docs.conduit.rs/", + }, + tags: ["matrix", "communication"], + load: () => import("./conduit/index").then((m) => m.generate), + }, + { + id: "evolutionapi", + name: "Evolution API", + version: "v2.1.2", + description: + "Evolution API is a robust platform dedicated to empowering small businesses with limited resources, going beyond a simple messaging solution via WhatsApp.", + logo: "evolutionapi.png", + links: { + github: "https://github.com/EvolutionAPI/evolution-api", + docs: "https://doc.evolution-api.com/v2/en/get-started/introduction", + website: "https://evolution-api.com/opensource-whatsapp-api/", + }, + tags: ["api", "whatsapp", "messaging"], + load: () => import("./evolutionapi/index").then((m) => m.generate), + }, + { + id: "conduwuit", + name: "Conduwuit", + version: "latest", + description: + "Well-maintained, featureful Matrix chat homeserver (fork of Conduit)", + logo: "conduwuit.svg", + links: { + github: "https://github.com/girlbossceo/conduwuit", + website: "https://conduwuit.puppyirl.gay", + docs: "https://conduwuit.puppyirl.gay/configuration.html", + }, + tags: ["backend", "chat", "communication", "matrix", "server"], + load: () => import("./conduwuit/index").then((m) => m.generate), + }, + { + id: "cloudflared", + name: "Cloudflared", + version: "latest", + description: + "A lightweight daemon that securely connects local services to the internet through Cloudflare Tunnel.", + logo: "cloudflared.svg", + links: { + github: "https://github.com/cloudflare/cloudflared", + website: + "https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/", + docs: "https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/", + }, + tags: ["cloud", "networking", "security", "tunnel"], + load: () => import("./cloudflared/index").then((m) => m.generate), + }, + { + id: "couchdb", + name: "CouchDB", + version: "latest", + description: + "CouchDB is a document-oriented NoSQL database that excels at replication and horizontal scaling.", + logo: "couchdb.png", + links: { + github: "https://github.com/apache/couchdb", + website: "https://couchdb.apache.org/", + docs: "https://docs.couchdb.org/en/stable/", + }, + tags: ["database", "storage"], + load: () => import("./couchdb/index").then((m) => m.generate), + }, + { + id: "it-tools", + name: "IT Tools", + version: "latest", + description: "A collection of handy online it-tools for developers.", + logo: "it-tools.svg", + links: { + github: "https://github.com/CorentinTh/it-tools", + website: "https://it-tools.tech", + }, + tags: ["developer", "tools"], + load: () => import("./it-tools/index").then((m) => m.generate), + }, + { + id: "superset", + name: "Superset (Unofficial)", + version: "latest", + description: "Data visualization and data exploration platform.", + logo: "superset.svg", + links: { + github: "https://github.com/amancevice/docker-superset", + website: "https://superset.apache.org", + docs: "https://superset.apache.org/docs/intro", + }, + tags: ["analytics", "bi", "dashboard", "database", "sql"], + load: () => import("./superset/index").then((m) => m.generate), + }, + { + id: "glance", + name: "Glance", + version: "latest", + description: + "A self-hosted dashboard that puts all your feeds in one place. Features RSS feeds, weather, bookmarks, site monitoring, and more in a minimal, fast interface.", + logo: "glance.png", + links: { + github: "https://github.com/glanceapp/glance", + docs: "https://github.com/glanceapp/glance/blob/main/docs/configuration.md", + }, + tags: ["dashboard", "monitoring", "widgets", "rss"], + load: () => import("./glance/index").then((m) => m.generate), + }, + { + id: "homarr", + name: "Homarr", + version: "latest", + description: + "A sleek, modern dashboard that puts all your apps and services in one place with Docker integration.", + logo: "homarr.png", + links: { + github: "https://github.com/homarr-labs/homarr", + docs: "https://homarr.dev/docs/getting-started/installation/docker", + website: "https://homarr.dev/", + }, + tags: ["dashboard", "monitoring"], + load: () => import("./homarr/index").then((m) => m.generate), + }, + { + id: "erpnext", + name: "ERPNext", + version: "version-15", + description: "100% Open Source and highly customizable ERP software.", + logo: "erpnext.svg", + links: { + github: "https://github.com/frappe/erpnext", + docs: "https://docs.frappe.io/erpnext", + website: "https://erpnext.com", + }, + tags: [ + "erp", + "accounts", + "manufacturing", + "retail", + "sales", + "pos", + "hrms", + ], + load: () => import("./erpnext/index").then((m) => m.generate), + }, + { + id: "maybe", + name: "Maybe", + version: "latest", + description: + "Maybe is a self-hosted finance tracking application designed to simplify budgeting and expenses.", + logo: "maybe.svg", + links: { + github: "https://github.com/maybe-finance/maybe", + website: "https://maybe.finance/", + docs: "https://docs.maybe.finance/", + }, + tags: ["finance", "self-hosted"], + load: () => import("./maybe/index").then((m) => m.generate), + }, + { + id: "spacedrive", + name: "Spacedrive", + version: "latest", + description: + "Spacedrive is a cross-platform file manager. It connects your devices together to help you organize files from anywhere. powered by a virtual distributed filesystem (VDFS) written in Rust. Organize files across many devices in one place.", + links: { + github: "https://github.com/spacedriveapp/spacedrive", + website: "https://spacedrive.com/", + docs: "https://www.spacedrive.com/docs/product/getting-started/introduction", + }, + logo: "spacedrive.png", + tags: ["file-manager", "vdfs", "storage"], + load: () => import("./spacedrive/index").then((m) => m.generate), + }, + { + id: "registry", + name: "Docker Registry", + version: "2", + description: + "Distribution implementation for storing and distributing of Docker container images and artifacts.", + links: { + github: "https://github.com/distribution/distribution", + website: "https://hub.docker.com/_/registry", + docs: "https://distribution.github.io/distribution/", + }, + logo: "registry.png", + tags: ["registry", "docker", "self-hosted"], + load: () => import("./registry/index").then((m) => m.generate), + }, + { + id: "alist", + name: "AList", + version: "v3.41.0", + description: + "🗂️A file list/WebDAV program that supports multiple storages, powered by Gin and Solidjs.", + logo: "alist.svg", + links: { + github: "https://github.com/AlistGo/alist", + website: "https://alist.nn.ci", + docs: "https://alist.nn.ci/guide/install/docker.html", + }, + tags: ["file", "webdav", "storage"], + load: () => import("./alist/index").then((m) => m.generate), + }, + { + id: "answer", + name: "Answer", + version: "v1.4.1", + description: + "Answer is an open-source Q&A platform for building a self-hosted question-and-answer service.", + logo: "answer.png", + links: { + github: "https://github.com/apache/answer", + website: "https://answer.apache.org/", + docs: "https://answer.apache.org/docs", + }, + tags: ["q&a", "self-hosted"], + load: () => import("./answer/index").then((m) => m.generate), + }, + { + id: "shlink", + name: "Shlink", + version: "stable", + description: + "URL shortener that can be used to serve shortened URLs under your own domain.", + logo: "shlink.svg", + links: { + github: "https://github.com/shlinkio/shlink", + website: "https://shlink.io", + docs: "https://shlink.io/documentation", + }, + tags: ["sharing", "shortener", "url"], + load: () => import("./shlink/index").then((m) => m.generate), + }, + { + id: "frappe-hr", + name: "Frappe HR", + version: "version-15", + description: + "Feature rich HR & Payroll software. 100% FOSS and customizable.", + logo: "frappe-hr.svg", + links: { + github: "https://github.com/frappe/hrms", + docs: "https://docs.frappe.io/hr", + website: "https://frappe.io/hr", + }, + tags: ["hrms", "payroll", "leaves", "expenses", "attendance", "performace"], + load: () => import("./frappe-hr/index").then((m) => m.generate), + }, + { + id: "formbricks", + name: "Formbricks", + version: "v3.1.3", + description: + "Formbricks is an open-source survey and form platform for collecting user data.", + logo: "formbricks.png", + links: { + github: "https://github.com/formbricks/formbricks", + website: "https://formbricks.com/", + docs: "https://formbricks.com/docs", + }, + tags: ["forms", "analytics"], + load: () => import("./formbricks/index").then((m) => m.generate), + }, + { + id: "trilium", + name: "Trilium", + description: + "Trilium Notes is a hierarchical note taking application with focus on building large personal knowledge bases.", + logo: "trilium.png", + version: "latest", + links: { + github: "https://github.com/zadam/trilium", + website: "https://github.com/zadam/trilium", + docs: "https://github.com/zadam/trilium/wiki/", + }, + tags: ["self-hosted", "productivity", "personal-use"], + load: () => import("./trilium/index").then((m) => m.generate), + }, + { + id: "convex", + name: "Convex", + version: "latest", + description: + "Convex is an open-source reactive database designed to make life easy for web app developers.", + logo: "convex.svg", + links: { + github: "https://github.com/get-convex/convex", + website: "https://www.convex.dev/", + docs: "https://www.convex.dev/docs", + }, + tags: ["backend", "database", "api"], + load: () => import("./convex/index").then((m) => m.generate), + }, +]; \ No newline at end of file From 51310dae1dfd3f6fda1b8b5a3fcc822a19154757 Mon Sep 17 00:00:00 2001 From: sondreal Date: Sun, 23 Feb 2025 19:15:17 +0100 Subject: [PATCH 10/16] fixed the links --- apps/dokploy/templates/templates.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts index b488cbdeb..4fafecb58 100644 --- a/apps/dokploy/templates/templates.ts +++ b/apps/dokploy/templates/templates.ts @@ -25,8 +25,8 @@ export const templates: TemplateData[] = [ "Outline is a self-hosted knowledge base and documentation platform that allows you to build and manage your own knowledge base applications.", links: { github: "https://github.com/outline/outline", - website: "https://outline.com/", - docs: "https://docs.outline.com/", + website: "https://getoutline.com/", + docs: "https://docs.getoutline.com/s/guide", }, logo: "outline.png", load: () => import("./outline/index").then((m) => m.generate), From f4d13c30302a342dd5fe4b99f25894aa699ebe97 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sun, 23 Feb 2025 14:35:28 -0600 Subject: [PATCH 11/16] Update apps/dokploy/templates/wikijs/docker-compose.yml --- apps/dokploy/templates/wikijs/docker-compose.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/apps/dokploy/templates/wikijs/docker-compose.yml b/apps/dokploy/templates/wikijs/docker-compose.yml index 132774198..137aca0ce 100644 --- a/apps/dokploy/templates/wikijs/docker-compose.yml +++ b/apps/dokploy/templates/wikijs/docker-compose.yml @@ -3,9 +3,6 @@ services: wiki: image: ghcr.io/requarks/wiki:2.5 restart: unless-stopped - ports: - # Change 5000 to the desired port - - "5000:3000" environment: - DB_TYPE - DB_HOST From 5871a91da57a783f8b115cb6cdf6621638e71571 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sun, 23 Feb 2025 14:35:33 -0600 Subject: [PATCH 12/16] Update apps/dokploy/templates/wikijs/docker-compose.yml --- apps/dokploy/templates/wikijs/docker-compose.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/dokploy/templates/wikijs/docker-compose.yml b/apps/dokploy/templates/wikijs/docker-compose.yml index 137aca0ce..c624f2fee 100644 --- a/apps/dokploy/templates/wikijs/docker-compose.yml +++ b/apps/dokploy/templates/wikijs/docker-compose.yml @@ -12,8 +12,6 @@ services: - DB_NAME depends_on: - db - networks: - - dokploy-network labels: - traefik.enable=true - traefik.constraint-label-stack=wikijs From c0b64c6e559ed74ca0ced596aa9747671a87ec3e Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sun, 23 Feb 2025 14:35:39 -0600 Subject: [PATCH 13/16] Update apps/dokploy/templates/wikijs/docker-compose.yml --- apps/dokploy/templates/wikijs/docker-compose.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/dokploy/templates/wikijs/docker-compose.yml b/apps/dokploy/templates/wikijs/docker-compose.yml index c624f2fee..6b21423d1 100644 --- a/apps/dokploy/templates/wikijs/docker-compose.yml +++ b/apps/dokploy/templates/wikijs/docker-compose.yml @@ -24,8 +24,6 @@ services: - POSTGRES_DB volumes: - wiki-db-data:/var/lib/postgresql/data - networks: - - dokploy-network networks: dokploy-network: external: true From ac3378ccb83a3a6bd53d110768363fb46031f7f5 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sun, 23 Feb 2025 15:38:25 -0600 Subject: [PATCH 14/16] feat(sponsors): add Synexa to sponsors section --- .github/sponsors/synexa.png | Bin 0 -> 42254 bytes README.md | 4 ++++ 2 files changed, 4 insertions(+) create mode 100644 .github/sponsors/synexa.png diff --git a/.github/sponsors/synexa.png b/.github/sponsors/synexa.png new file mode 100644 index 0000000000000000000000000000000000000000..737ccd57629252cf86562ba3b5cee74128a889be GIT binary patch literal 42254 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 Lightnode + + ### Premium Supporters 🥇 @@ -94,8 +96,10 @@ For detailed documentation, visit [docs.dokploy.com](https://docs.dokploy.com). Startupfame Itsdb-center Openalternative +Synexa + ### Community Backers 🤝
From 125e44812b6926a00c11b5b1f03d0cf0b88c7095 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sun, 23 Feb 2025 18:11:21 -0600 Subject: [PATCH 15/16] refactor(security): remove permit root login status row --- .../dashboard/settings/servers/security-audit.tsx | 9 --------- 1 file changed, 9 deletions(-) diff --git a/apps/dokploy/components/dashboard/settings/servers/security-audit.tsx b/apps/dokploy/components/dashboard/settings/servers/security-audit.tsx index 475f2b8ff..1a90859f1 100644 --- a/apps/dokploy/components/dashboard/settings/servers/security-audit.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/security-audit.tsx @@ -145,15 +145,6 @@ export const SecurityAudit = ({ serverId }: Props) => { : "Enabled (Password Authentication should be disabled)" } /> - Date: Sun, 23 Feb 2025 18:11:27 -0600 Subject: [PATCH 16/16] refactor(ui): improve log highlighting and template formatting --- .../dashboard/docker/logs/terminal-line.tsx | 46 +++++++------- apps/dokploy/templates/convex/index.ts | 60 +++++++++---------- apps/dokploy/templates/templates.ts | 1 - 3 files changed, 53 insertions(+), 54 deletions(-) diff --git a/apps/dokploy/components/dashboard/docker/logs/terminal-line.tsx b/apps/dokploy/components/dashboard/docker/logs/terminal-line.tsx index 116efedf3..359fbfa93 100644 --- a/apps/dokploy/components/dashboard/docker/logs/terminal-line.tsx +++ b/apps/dokploy/components/dashboard/docker/logs/terminal-line.tsx @@ -35,34 +35,34 @@ export function TerminalLine({ log, noTimestamp, searchTerm }: LogLineProps) { }) : "--- No time found ---"; - const highlightMessage = (text: string, term: string) => { - if (!term) { - return ( - - ); - } - - const htmlContent = fancyAnsi.toHtml(text); - const searchRegex = new RegExp(`(${escapeRegExp(term)})`, "gi"); - - const modifiedContent = htmlContent.replace( - searchRegex, - (match) => - `${match}`, - ); - + const highlightMessage = (text: string, term: string) => { + if (!term) { return ( ); - }; + } + + const htmlContent = fancyAnsi.toHtml(text); + const searchRegex = new RegExp(`(${escapeRegExp(term)})`, "gi"); + + const modifiedContent = htmlContent.replace( + searchRegex, + (match) => + `${match}`, + ); + + return ( + + ); + }; const tooltip = (color: string, timestamp: string | null) => { const square = ( diff --git a/apps/dokploy/templates/convex/index.ts b/apps/dokploy/templates/convex/index.ts index 6a112cdee..badfe7320 100644 --- a/apps/dokploy/templates/convex/index.ts +++ b/apps/dokploy/templates/convex/index.ts @@ -1,38 +1,38 @@ import { - type DomainSchema, - type Schema, - type Template, - generateRandomDomain, + type DomainSchema, + type Schema, + type Template, + generateRandomDomain, } from "../utils"; export function generate(schema: Schema): Template { - const dashboardDomain = generateRandomDomain(schema); - const backendDomain = generateRandomDomain(schema); - const actionsDomain = generateRandomDomain(schema); + const dashboardDomain = generateRandomDomain(schema); + const backendDomain = generateRandomDomain(schema); + const actionsDomain = generateRandomDomain(schema); - const domains: DomainSchema[] = [ - { - host: dashboardDomain, - port: 6791, - serviceName: "dashboard", - }, - { - host: backendDomain, - port: 3210, - serviceName: "backend", - }, - { - host: actionsDomain, - port: 3211, - serviceName: "backend", - }, - ]; + const domains: DomainSchema[] = [ + { + host: dashboardDomain, + port: 6791, + serviceName: "dashboard", + }, + { + host: backendDomain, + port: 3210, + serviceName: "backend", + }, + { + host: actionsDomain, + port: 3211, + serviceName: "backend", + }, + ]; - const envs = [ - `NEXT_PUBLIC_DEPLOYMENT_URL=http://${backendDomain}`, - `CONVEX_CLOUD_ORIGIN=http://${backendDomain}`, - `CONVEX_SITE_ORIGIN=http://${actionsDomain}`, - ]; + const envs = [ + `NEXT_PUBLIC_DEPLOYMENT_URL=http://${backendDomain}`, + `CONVEX_CLOUD_ORIGIN=http://${backendDomain}`, + `CONVEX_SITE_ORIGIN=http://${actionsDomain}`, + ]; - return { envs, domains }; + return { envs, domains }; } diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts index dc5205efc..d39465a8e 100644 --- a/apps/dokploy/templates/templates.ts +++ b/apps/dokploy/templates/templates.ts @@ -1619,4 +1619,3 @@ export const templates: TemplateData[] = [ load: () => import("./wikijs/index").then((m) => m.generate), }, ]; -