From dc5157449dfae65e802a38508defbd4e23091b3e Mon Sep 17 00:00:00 2001 From: Tony Hart <154579112+thaarrtt@users.noreply.github.com> Date: Fri, 25 Jul 2025 13:39:01 +0700 Subject: [PATCH] add keycloak template (#243) --- blueprints/keycloak/docker-compose.yml | 34 + blueprints/keycloak/keycloak.svg | 1 + blueprints/keycloak/template.toml | 24 + meta.json | 1101 +++++++++++++++++++----- 4 files changed, 967 insertions(+), 193 deletions(-) create mode 100644 blueprints/keycloak/docker-compose.yml create mode 100644 blueprints/keycloak/keycloak.svg create mode 100644 blueprints/keycloak/template.toml diff --git a/blueprints/keycloak/docker-compose.yml b/blueprints/keycloak/docker-compose.yml new file mode 100644 index 00000000..b2b0f777 --- /dev/null +++ b/blueprints/keycloak/docker-compose.yml @@ -0,0 +1,34 @@ +version: '3.8' + +services: + postgres: + image: postgres:16.2 + environment: + POSTGRES_DB: ${POSTGRES_DB} + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + - postgres_data:/var/lib/postgresql/data + restart: always + + keycloak: + image: quay.io/keycloak/keycloak:26.0 + environment: + KC_DB: postgres + KC_DB_URL: jdbc:postgresql://postgres:5432/${POSTGRES_DB} + KC_DB_USERNAME: ${POSTGRES_USER} + KC_DB_PASSWORD: ${POSTGRES_PASSWORD} + KEYCLOAK_ADMIN: ${KEYCLOAK_ADMIN} + KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD} + KC_HOSTNAME: ${KC_HOSTNAME} + KC_HOSTNAME_PORT: 8080 + KC_HTTP_ENABLED: true + KC_HOSTNAME_STRICT_HTTPS: false + KC_HEALTH_ENABLED: true + depends_on: + - postgres + command: start-dev + restart: always + +volumes: + postgres_data: diff --git a/blueprints/keycloak/keycloak.svg b/blueprints/keycloak/keycloak.svg new file mode 100644 index 00000000..e3d5bdf2 --- /dev/null +++ b/blueprints/keycloak/keycloak.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/blueprints/keycloak/template.toml b/blueprints/keycloak/template.toml new file mode 100644 index 00000000..86c7107a --- /dev/null +++ b/blueprints/keycloak/template.toml @@ -0,0 +1,24 @@ +[variables] +main_domain = "${domain}" +POSTGRES_DB = "keycloak" +POSTGRES_USER = "keycloakuser" +POSTGRES_PASSWORD = "${password:32}" +KEYCLOAK_ADMIN = "admin" +KEYCLOAK_ADMIN_PASSWORD = "${password:32}" +KC_HOSTNAME = "${main_domain}" + +[config] +[[config.domains]] +serviceName = "keycloak" +port = 8080 +host = "${main_domain}" + +[config.env] +POSTGRES_DB = "${POSTGRES_DB}" +POSTGRES_USER = "${POSTGRES_USER}" +POSTGRES_PASSWORD = "${POSTGRES_PASSWORD}" +KEYCLOAK_ADMIN = "${KEYCLOAK_ADMIN}" +KEYCLOAK_ADMIN_PASSWORD = "${KEYCLOAK_ADMIN_PASSWORD}" +KC_HOSTNAME = "${KC_HOSTNAME}" + +[[config.mounts]] diff --git a/meta.json b/meta.json index 45129c63..5d689de6 100644 --- a/meta.json +++ b/meta.json @@ -10,7 +10,12 @@ "docs": "https://autobase.tech/docs" }, "logo": "autobase.svg", - "tags": ["database", "postgres", "self-hosted", "server"] + "tags": [ + "database", + "postgres", + "self-hosted", + "server" + ] }, { "id": "capso", @@ -23,9 +28,15 @@ "docs": "https://cap.so/docs/" }, "logo": "capso.png", - "tags": ["web", "s3", "mysql", "development", "self-hosted"] -}, -{ + "tags": [ + "web", + "s3", + "mysql", + "development", + "self-hosted" + ] + }, + { "id": "authentik", "name": "Authentik", "version": "2025.6.3", @@ -57,7 +68,13 @@ "docs": "https://github.com/freescout-helpdesk/freescout/wiki/Installation-Guide" }, "logo": "freescout.svg", - "tags": ["helpdesk", "support", "email", "customer-service", "self-hosted"] + "tags": [ + "helpdesk", + "support", + "email", + "customer-service", + "self-hosted" + ] }, { "id": "openresty-manager", @@ -70,7 +87,14 @@ "docs": "https://github.com/Safe3/openresty-manager" }, "logo": "logo.svg", - "tags": ["web", "proxy", "security", "self-hosted", "openresty", "nginx"] + "tags": [ + "web", + "proxy", + "security", + "self-hosted", + "openresty", + "nginx" + ] }, { "id": "appwrite", @@ -83,7 +107,11 @@ "docs": "https://appwrite.io/docs" }, "logo": "appwrite.svg", - "tags": ["database", "firebase", "postgres"] + "tags": [ + "database", + "firebase", + "postgres" + ] }, { "id": "outline", @@ -96,7 +124,11 @@ "docs": "https://docs.getoutline.com/s/guide" }, "logo": "outline.png", - "tags": ["documentation", "knowledge-base", "self-hosted"] + "tags": [ + "documentation", + "knowledge-base", + "self-hosted" + ] }, { "id": "supabase", @@ -109,7 +141,11 @@ "docs": "https://supabase.com/docs/guides/self-hosting" }, "logo": "supabase.svg", - "tags": ["database", "firebase", "postgres"], + "tags": [ + "database", + "firebase", + "postgres" + ], "dokploy_version": ">=0.22.5" }, { @@ -123,7 +159,11 @@ "docs": "https://supabase.com/docs/guides/self-hosting" }, "logo": "supabase.svg", - "tags": ["database", "firebase", "postgres"], + "tags": [ + "database", + "firebase", + "postgres" + ], "dokploy_version": "<0.22.5" }, { @@ -137,7 +177,11 @@ "website": "https://pocketbase.io/", "docs": "https://pocketbase.io/docs/" }, - "tags": ["backend", "database", "api"] + "tags": [ + "backend", + "database", + "api" + ] }, { "id": "plausible", @@ -150,7 +194,9 @@ "website": "https://plausible.io/", "docs": "https://plausible.io/docs" }, - "tags": ["analytics"] + "tags": [ + "analytics" + ] }, { "id": "calcom", @@ -163,7 +209,10 @@ "docs": "https://cal.com/docs" }, "logo": "calcom.jpg", - "tags": ["scheduling", "booking"] + "tags": [ + "scheduling", + "booking" + ] }, { "id": "grafana", @@ -176,7 +225,9 @@ "website": "https://grafana.com/", "docs": "https://grafana.com/docs/" }, - "tags": ["monitoring"] + "tags": [ + "monitoring" + ] }, { "id": "stalwart", @@ -210,7 +261,12 @@ "website": "https://datalens.tech/", "docs": "https://datalens.tech/docs/" }, - "tags": ["analytics", "self-hosted", "bi", "monitoring"] + "tags": [ + "analytics", + "self-hosted", + "bi", + "monitoring" + ] }, { "id": "directus", @@ -223,7 +279,9 @@ "website": "https://directus.io/", "docs": "https://docs.directus.io/" }, - "tags": ["cms"] + "tags": [ + "cms" + ] }, { "id": "baserow", @@ -236,7 +294,9 @@ "website": "https://baserow.io/", "docs": "https://baserow.io/docs/index" }, - "tags": ["database"] + "tags": [ + "database" + ] }, { "id": "budibase", @@ -249,7 +309,12 @@ "website": "https://budibase.com/", "docs": "https://docs.budibase.com/docs/" }, - "tags": ["database", "low-code", "nocode", "applications"] + "tags": [ + "database", + "low-code", + "nocode", + "applications" + ] }, { "id": "forgejo", @@ -262,7 +327,10 @@ "website": "https://forgejo.org/", "docs": "https://forgejo.org/docs/latest/" }, - "tags": ["self-hosted", "storage"] + "tags": [ + "self-hosted", + "storage" + ] }, { "id": "gitlab-ce", @@ -275,7 +343,12 @@ "website": "https://gitlab.com/", "docs": "https://docs.gitlab.com/ee/" }, - "tags": ["git", "ci-cd", "version-control", "project-management"] + "tags": [ + "git", + "ci-cd", + "version-control", + "project-management" + ] }, { "id": "ghost", @@ -288,7 +361,9 @@ "website": "https://ghost.org/", "docs": "https://ghost.org/docs/" }, - "tags": ["cms"] + "tags": [ + "cms" + ] }, { "id": "lodestone", @@ -301,7 +376,11 @@ "website": "https://lodestone.cc", "docs": "https://github.com/Lodestone-Team/lodestone/wiki" }, - "tags": ["minecraft", "hosting", "server"] + "tags": [ + "minecraft", + "hosting", + "server" + ] }, { "id": "dragonfly-db", @@ -314,7 +393,10 @@ "website": "https://www.dragonflydb.io/", "docs": "https://www.dragonflydb.io/docs" }, - "tags": ["database", "redis"] + "tags": [ + "database", + "redis" + ] }, { "id": "stack-auth", @@ -327,7 +409,11 @@ "website": "https://stack-auth.com/", "docs": "https://docs.stack-auth.com/next/overview" }, - "tags": ["authentication", "auth", "authorization"] + "tags": [ + "authentication", + "auth", + "authorization" + ] }, { "id": "uptime-kuma", @@ -340,7 +426,9 @@ "website": "https://uptime.kuma.pet/", "docs": "https://github.com/louislam/uptime-kuma/wiki" }, - "tags": ["monitoring"] + "tags": [ + "monitoring" + ] }, { "id": "n8n", @@ -353,7 +441,9 @@ "website": "https://n8n.io/", "docs": "https://docs.n8n.io/" }, - "tags": ["automation"] + "tags": [ + "automation" + ] }, { "id": "kestra", @@ -366,7 +456,9 @@ "website": "https://kestra.io", "docs": "https://kestra.io/docs" }, - "tags": ["automation"] + "tags": [ + "automation" + ] }, { "id": "wordpress", @@ -379,7 +471,9 @@ "website": "https://wordpress.org/", "docs": "https://wordpress.org/documentation/" }, - "tags": ["cms"] + "tags": [ + "cms" + ] }, { "id": "odoo", @@ -392,7 +486,9 @@ "website": "https://odoo.com/", "docs": "https://www.odoo.com/documentation/" }, - "tags": ["cms"] + "tags": [ + "cms" + ] }, { "id": "appsmith", @@ -405,7 +501,9 @@ "website": "https://appsmith.com/", "docs": "https://docs.appsmith.com/" }, - "tags": ["cms"] + "tags": [ + "cms" + ] }, { "id": "excalidraw", @@ -418,7 +516,9 @@ "website": "https://excalidraw.com/", "docs": "https://docs.excalidraw.com/" }, - "tags": ["drawing"] + "tags": [ + "drawing" + ] }, { "id": "documenso", @@ -431,7 +531,9 @@ "docs": "https://documenso.com/docs" }, "logo": "documenso.png", - "tags": ["document-signing"] + "tags": [ + "document-signing" + ] }, { "id": "nocodb", @@ -444,7 +546,12 @@ "docs": "https://docs.nocodb.com/" }, "logo": "nocodb.png", - "tags": ["database", "spreadsheet", "low-code", "nocode"] + "tags": [ + "database", + "spreadsheet", + "low-code", + "nocode" + ] }, { "id": "meilisearch", @@ -457,7 +564,9 @@ "website": "https://www.meilisearch.com/", "docs": "https://docs.meilisearch.com/" }, - "tags": ["search"] + "tags": [ + "search" + ] }, { "id": "mattermost", @@ -470,7 +579,10 @@ "website": "https://mattermost.com/", "docs": "https://docs.mattermost.com/" }, - "tags": ["chat", "self-hosted"] + "tags": [ + "chat", + "self-hosted" + ] }, { "id": "phpmyadmin", @@ -483,7 +595,9 @@ "website": "https://www.phpmyadmin.net/", "docs": "https://www.phpmyadmin.net/docs/" }, - "tags": ["database"] + "tags": [ + "database" + ] }, { "id": "rocketchat", @@ -496,7 +610,9 @@ "website": "https://rocket.chat/", "docs": "https://rocket.chat/docs/" }, - "tags": ["chat"] + "tags": [ + "chat" + ] }, { "id": "minio", @@ -509,7 +625,9 @@ "website": "https://minio.io/", "docs": "https://docs.minio.io/" }, - "tags": ["storage"] + "tags": [ + "storage" + ] }, { "id": "metabase", @@ -522,7 +640,10 @@ "website": "https://www.metabase.com/", "docs": "https://www.metabase.com/docs/" }, - "tags": ["database", "dashboard"] + "tags": [ + "database", + "dashboard" + ] }, { "id": "glitchtip", @@ -535,7 +656,9 @@ "website": "https://glitchtip.com/", "docs": "https://glitchtip.com/documentation" }, - "tags": ["hosting"] + "tags": [ + "hosting" + ] }, { "id": "open-webui", @@ -548,7 +671,9 @@ "website": "https://openwebui.com/", "docs": "https://docs.openwebui.com/" }, - "tags": ["chat"] + "tags": [ + "chat" + ] }, { "id": "mailpit", @@ -561,7 +686,10 @@ "website": "https://mailpit.axllent.org/", "docs": "https://mailpit.axllent.org/docs/" }, - "tags": ["email", "smtp"] + "tags": [ + "email", + "smtp" + ] }, { "id": "listmonk", @@ -574,7 +702,11 @@ "website": "https://listmonk.app/", "docs": "https://listmonk.app/docs/" }, - "tags": ["email", "newsletter", "mailing-list"] + "tags": [ + "email", + "newsletter", + "mailing-list" + ] }, { "id": "doublezero", @@ -587,7 +719,9 @@ "website": "https://www.double-zero.cloud/", "docs": "https://github.com/technomancy-dev/00" }, - "tags": ["email"] + "tags": [ + "email" + ] }, { "id": "umami", @@ -600,7 +734,9 @@ "website": "https://umami.is", "docs": "https://umami.is/docs" }, - "tags": ["analytics"] + "tags": [ + "analytics" + ] }, { "id": "jellyfin", @@ -613,7 +749,9 @@ "website": "https://jellyfin.org/", "docs": "https://jellyfin.org/docs/" }, - "tags": ["media system"] + "tags": [ + "media system" + ] }, { "id": "teable", @@ -626,7 +764,12 @@ "website": "https://teable.io/", "docs": "https://help.teable.io/" }, - "tags": ["database", "spreadsheet", "low-code", "nocode"] + "tags": [ + "database", + "spreadsheet", + "low-code", + "nocode" + ] }, { "id": "zipline", @@ -639,7 +782,10 @@ "website": "https://zipline.diced.sh/", "docs": "https://zipline.diced.sh/docs/" }, - "tags": ["media system", "storage"] + "tags": [ + "media system", + "storage" + ] }, { "id": "soketi", @@ -652,7 +798,9 @@ "website": "https://soketi.app/", "docs": "https://docs.soketi.app/" }, - "tags": ["chat"] + "tags": [ + "chat" + ] }, { "id": "aptabase", @@ -665,7 +813,10 @@ "website": "https://aptabase.com/", "docs": "https://github.com/aptabase/aptabase/blob/main/README.md" }, - "tags": ["analytics", "self-hosted"] + "tags": [ + "analytics", + "self-hosted" + ] }, { "id": "typebot", @@ -678,7 +829,11 @@ "website": "https://typebot.io/", "docs": "https://docs.typebot.io/get-started/introduction" }, - "tags": ["chatbot", "builder", "open-source"] + "tags": [ + "chatbot", + "builder", + "open-source" + ] }, { "id": "typecho", @@ -691,7 +846,11 @@ "website": "https://typecho.org/", "docs": "http://docs.typecho.org" }, - "tags": ["blog", "cms", "php"] + "tags": [ + "blog", + "cms", + "php" + ] }, { "id": "gitea", @@ -704,7 +863,10 @@ "website": "https://gitea.com/", "docs": "https://docs.gitea.com/installation/install-with-docker" }, - "tags": ["self-hosted", "storage"] + "tags": [ + "self-hosted", + "storage" + ] }, { "id": "gitea-mirror", @@ -717,7 +879,14 @@ "website": "https://github.com/arunavo4/gitea-mirror", "docs": "https://github.com/arunavo4/gitea-mirror#readme" }, - "tags": ["git", "mirror", "github", "gitea", "self-hosted", "automation"] + "tags": [ + "git", + "mirror", + "github", + "gitea", + "self-hosted", + "automation" + ] }, { "id": "roundcube", @@ -730,7 +899,11 @@ "website": "https://roundcube.net/", "docs": "https://roundcube.net/about/" }, - "tags": ["self-hosted", "email", "webmail"] + "tags": [ + "self-hosted", + "email", + "webmail" + ] }, { "id": "filebrowser", @@ -743,7 +916,10 @@ "website": "https://filebrowser.org/", "docs": "https://filebrowser.org/" }, - "tags": ["file-manager", "storage"] + "tags": [ + "file-manager", + "storage" + ] }, { "id": "focalboard", @@ -756,7 +932,9 @@ "website": "https://focalboard.com", "docs": "https://www.focalboard.com/docs/" }, - "tags": ["kanban"] + "tags": [ + "kanban" + ] }, { "id": "tolgee", @@ -769,7 +947,12 @@ "website": "https://tolgee.io", "docs": "https://tolgee.io/platform" }, - "tags": ["self-hosted", "i18n", "localization", "translations"] + "tags": [ + "self-hosted", + "i18n", + "localization", + "translations" + ] }, { "id": "portainer", @@ -782,7 +965,10 @@ "website": "https://www.portainer.io/", "docs": "https://docs.portainer.io/" }, - "tags": ["cloud", "monitoring"] + "tags": [ + "cloud", + "monitoring" + ] }, { "id": "plane", @@ -795,7 +981,9 @@ "website": "https://plane.so", "docs": "https://docs.plane.so/" }, - "tags": ["kanban"] + "tags": [ + "kanban" + ] }, { "id": "pterodactyl", @@ -808,7 +996,11 @@ "website": "https://pterodactyl.io", "docs": "https://pterodactyl.io/project/introduction.html" }, - "tags": ["self-hosted", "open-source", "management"] + "tags": [ + "self-hosted", + "open-source", + "management" + ] }, { "id": "pyrodactyl", @@ -821,7 +1013,11 @@ "website": "https://pyrodactyl.dev", "docs": "https://pyrodactyl.dev/docs" }, - "tags": ["self-hosted", "open-source", "management"] + "tags": [ + "self-hosted", + "open-source", + "management" + ] }, { "id": "influxdb", @@ -834,7 +1030,12 @@ "website": "https://www.influxdata.com/", "docs": "https://docs.influxdata.com/influxdb/v2/" }, - "tags": ["self-hosted", "open-source", "storage", "database"] + "tags": [ + "self-hosted", + "open-source", + "storage", + "database" + ] }, { "id": "infisical", @@ -847,7 +1048,10 @@ "website": "https://infisical.com/", "docs": "https://infisical.com/docs/documentation/getting-started/introduction" }, - "tags": ["self-hosted", "open-source"] + "tags": [ + "self-hosted", + "open-source" + ] }, { "id": "docmost", @@ -860,7 +1064,11 @@ "website": "https://docmost.com/", "docs": "https://docmost.com/docs/" }, - "tags": ["self-hosted", "open-source", "manager"] + "tags": [ + "self-hosted", + "open-source", + "manager" + ] }, { "id": "vaultwarden", @@ -873,7 +1081,9 @@ "website": "", "docs": "https://github.com/dani-garcia/vaultwarden/wiki" }, - "tags": ["open-source"] + "tags": [ + "open-source" + ] }, { "id": "linkding", @@ -886,7 +1096,10 @@ "website": "https://sissbruecker.github.io/linkding/", "docs": "https://github.com/sissbruecker/linkding/blob/master/docs/Options.md" }, - "tags": ["bookmark-manager", "self-hosted"] + "tags": [ + "bookmark-manager", + "self-hosted" + ] }, { "id": "linkwarden", @@ -899,7 +1112,10 @@ "website": "https://linkwarden.app/", "docs": "https://docs.linkwarden.app/" }, - "tags": ["bookmarks", "link-sharing"] + "tags": [ + "bookmarks", + "link-sharing" + ] }, { "id": "hi-events", @@ -912,7 +1128,11 @@ "website": "https://hi.events/", "docs": "https://hi.events/docs" }, - "tags": ["self-hosted", "open-source", "manager"] + "tags": [ + "self-hosted", + "open-source", + "manager" + ] }, { "id": "hoarder", @@ -925,7 +1145,11 @@ "website": "https://hoarder.app/", "docs": "https://docs.hoarder.app/" }, - "tags": ["self-hosted", "bookmarks", "link-sharing"] + "tags": [ + "self-hosted", + "bookmarks", + "link-sharing" + ] }, { "id": "windows", @@ -938,7 +1162,11 @@ "website": "", "docs": "https://github.com/dockur/windows?tab=readme-ov-file#how-do-i-use-it" }, - "tags": ["self-hosted", "open-source", "os"] + "tags": [ + "self-hosted", + "open-source", + "os" + ] }, { "id": "macos", @@ -951,7 +1179,11 @@ "website": "", "docs": "https://github.com/dockur/macos?tab=readme-ov-file#how-do-i-use-it" }, - "tags": ["self-hosted", "open-source", "os"] + "tags": [ + "self-hosted", + "open-source", + "os" + ] }, { "id": "coder", @@ -964,7 +1196,11 @@ "website": "https://coder.com/", "docs": "https://coder.com/docs" }, - "tags": ["self-hosted", "open-source", "builder"] + "tags": [ + "self-hosted", + "open-source", + "builder" + ] }, { "id": "stirling", @@ -977,7 +1213,10 @@ "website": "https://www.stirlingpdf.com/", "docs": "https://docs.stirlingpdf.com/" }, - "tags": ["pdf", "tools"] + "tags": [ + "pdf", + "tools" + ] }, { "id": "lobe-chat", @@ -990,7 +1229,10 @@ "website": "https://chat-preview.lobehub.com/", "docs": "https://lobehub.com/docs/self-hosting/platform/docker-compose" }, - "tags": ["IA", "chat"] + "tags": [ + "IA", + "chat" + ] }, { "id": "peppermint", @@ -1003,7 +1245,11 @@ "website": "https://peppermint.sh/", "docs": "https://docs.peppermint.sh/" }, - "tags": ["api", "development", "documentation"] + "tags": [ + "api", + "development", + "documentation" + ] }, { "id": "windmill", @@ -1016,7 +1262,11 @@ "website": "https://www.windmill.dev/", "docs": "https://docs.windmill.dev/" }, - "tags": ["workflow", "automation", "development"] + "tags": [ + "workflow", + "automation", + "development" + ] }, { "id": "activepieces", @@ -1029,7 +1279,11 @@ "website": "https://www.activepieces.com/", "docs": "https://www.activepieces.com/docs" }, - "tags": ["automation", "workflow", "no-code"] + "tags": [ + "automation", + "workflow", + "no-code" + ] }, { "id": "invoiceshelf", @@ -1042,7 +1296,11 @@ "website": "https://invoiceshelf.com", "docs": "https://github.com/InvoiceShelf/invoiceshelf#readme" }, - "tags": ["invoice", "business", "finance"] + "tags": [ + "invoice", + "business", + "finance" + ] }, { "id": "postiz", @@ -1055,7 +1313,11 @@ "website": "https://postiz.com", "docs": "https://docs.postiz.com" }, - "tags": ["cms", "content-management", "publishing"] + "tags": [ + "cms", + "content-management", + "publishing" + ] }, { "id": "slash", @@ -1068,7 +1330,11 @@ "website": "https://github.com/yourselfhosted/slash#readme", "docs": "https://github.com/yourselfhosted/slash/wiki" }, - "tags": ["bookmarks", "link-shortener", "self-hosted"] + "tags": [ + "bookmarks", + "link-shortener", + "self-hosted" + ] }, { "id": "discord-tickets", @@ -1081,7 +1347,11 @@ "website": "https://discordtickets.app", "docs": "https://discordtickets.app/self-hosting/installation/docker/" }, - "tags": ["discord", "tickets", "support"] + "tags": [ + "discord", + "tickets", + "support" + ] }, { "id": "nextcloud-aio", @@ -1094,7 +1364,10 @@ "website": "https://nextcloud.com/", "docs": "https://docs.nextcloud.com/" }, - "tags": ["file-manager", "sync"] + "tags": [ + "file-manager", + "sync" + ] }, { "id": "blender", @@ -1107,7 +1380,11 @@ "website": "https://www.blender.org/", "docs": "https://docs.blender.org/" }, - "tags": ["3d", "rendering", "animation"] + "tags": [ + "3d", + "rendering", + "animation" + ] }, { "id": "heyform", @@ -1120,7 +1397,13 @@ "website": "https://heyform.net", "docs": "https://docs.heyform.net" }, - "tags": ["form", "builder", "questionnaire", "quiz", "survey"] + "tags": [ + "form", + "builder", + "questionnaire", + "quiz", + "survey" + ] }, { "id": "chatwoot", @@ -1133,7 +1416,11 @@ "website": "https://www.chatwoot.com", "docs": "https://www.chatwoot.com/docs" }, - "tags": ["support", "chat", "customer-service"] + "tags": [ + "support", + "chat", + "customer-service" + ] }, { "id": "discourse", @@ -1146,7 +1433,11 @@ "website": "https://www.discourse.org/", "docs": "https://meta.discourse.org/" }, - "tags": ["forum", "community", "discussion"] + "tags": [ + "forum", + "community", + "discussion" + ] }, { "id": "immich", @@ -1159,7 +1450,12 @@ "website": "https://immich.app/", "docs": "https://immich.app/docs/overview/introduction" }, - "tags": ["photos", "videos", "backup", "media"] + "tags": [ + "photos", + "videos", + "backup", + "media" + ] }, { "id": "twenty", @@ -1172,7 +1468,11 @@ "website": "https://twenty.com", "docs": "https://docs.twenty.com" }, - "tags": ["crm", "sales", "business"] + "tags": [ + "crm", + "sales", + "business" + ] }, { "id": "yourls", @@ -1185,7 +1485,10 @@ "website": "https://yourls.org/", "docs": "https://yourls.org/#documentation" }, - "tags": ["url-shortener", "php"] + "tags": [ + "url-shortener", + "php" + ] }, { "id": "ryot", @@ -1198,7 +1501,11 @@ "website": "https://ryot.io/", "docs": "https://docs.ryot.io/" }, - "tags": ["media", "tracking", "self-hosted"] + "tags": [ + "media", + "tracking", + "self-hosted" + ] }, { "id": "photoprism", @@ -1211,7 +1518,11 @@ "website": "https://www.photoprism.app/", "docs": "https://docs.photoprism.app/" }, - "tags": ["media", "photos", "self-hosted"] + "tags": [ + "media", + "photos", + "self-hosted" + ] }, { "id": "ontime", @@ -1224,7 +1535,9 @@ "website": "https://getontime.no", "docs": "https://docs.getontime.no" }, - "tags": ["event"] + "tags": [ + "event" + ] }, { "id": "triggerdotdev", @@ -1237,7 +1550,10 @@ "website": "https://trigger.dev/", "docs": "https://trigger.dev/docs" }, - "tags": ["event-driven", "applications"] + "tags": [ + "event-driven", + "applications" + ] }, { "id": "browserless", @@ -1250,7 +1566,10 @@ "website": "https://www.browserless.io/", "docs": "https://docs.browserless.io/" }, - "tags": ["browser", "automation"] + "tags": [ + "browser", + "automation" + ] }, { "id": "drawio", @@ -1263,7 +1582,10 @@ "website": "https://draw.io/", "docs": "https://www.drawio.com/doc/" }, - "tags": ["drawing", "diagrams"] + "tags": [ + "drawing", + "diagrams" + ] }, { "id": "kimai", @@ -1276,7 +1598,11 @@ "website": "https://www.kimai.org", "docs": "https://www.kimai.org/documentation" }, - "tags": ["invoice", "business", "finance"] + "tags": [ + "invoice", + "business", + "finance" + ] }, { "id": "logto", @@ -1289,7 +1615,10 @@ "website": "https://logto.io/", "docs": "https://docs.logto.io/introduction" }, - "tags": ["identity", "auth"] + "tags": [ + "identity", + "auth" + ] }, { "id": "pocket-id", @@ -1302,7 +1631,10 @@ "website": "https://pocket-id.org/", "docs": "https://pocket-id.org/docs" }, - "tags": ["identity", "auth"] + "tags": [ + "identity", + "auth" + ] }, { "id": "penpot", @@ -1315,7 +1647,10 @@ "website": "https://penpot.app/", "docs": "https://docs.penpot.app/" }, - "tags": ["design", "collaboration"] + "tags": [ + "design", + "collaboration" + ] }, { "id": "huly", @@ -1328,7 +1663,11 @@ "website": "https://huly.io/", "docs": "https://docs.huly.io/" }, - "tags": ["project-management", "community", "discussion"] + "tags": [ + "project-management", + "community", + "discussion" + ] }, { "id": "unsend", @@ -1341,7 +1680,11 @@ "website": "https://unsend.dev/", "docs": "https://docs.unsend.dev/get-started/" }, - "tags": ["e-mail", "marketing", "business"] + "tags": [ + "e-mail", + "marketing", + "business" + ] }, { "id": "langflow", @@ -1354,7 +1697,9 @@ "website": "https://www.langflow.org/", "docs": "https://docs.langflow.org/" }, - "tags": ["ai"] + "tags": [ + "ai" + ] }, { "id": "elastic-search", @@ -1367,7 +1712,10 @@ "website": "https://www.elastic.co/elasticsearch/", "docs": "https://docs.elastic.co/elasticsearch/" }, - "tags": ["search", "analytics"] + "tags": [ + "search", + "analytics" + ] }, { "id": "onedev", @@ -1380,7 +1728,10 @@ "website": "https://onedev.io/", "docs": "https://docs.onedev.io/" }, - "tags": ["self-hosted", "development"] + "tags": [ + "self-hosted", + "development" + ] }, { "id": "unifi", @@ -1393,7 +1744,10 @@ "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"] + "tags": [ + "self-hosted", + "networking" + ] }, { "id": "glpi", @@ -1406,7 +1760,11 @@ "website": "https://glpi-project.org/", "docs": "https://glpi-project.org/documentation/" }, - "tags": ["self-hosted", "project-management", "management"] + "tags": [ + "self-hosted", + "project-management", + "management" + ] }, { "id": "checkmate", @@ -1419,7 +1777,11 @@ "website": "https://bluewavelabs.ca", "docs": "https://bluewavelabs.gitbook.io/checkmate" }, - "tags": ["self-hosted", "monitoring", "uptime"] + "tags": [ + "self-hosted", + "monitoring", + "uptime" + ] }, { "id": "gotenberg", @@ -1432,7 +1794,12 @@ "website": "https://gotenberg.dev", "docs": "https://gotenberg.dev/docs/getting-started/introduction" }, - "tags": ["api", "backend", "pdf", "tools"] + "tags": [ + "api", + "backend", + "pdf", + "tools" + ] }, { "id": "actualbudget", @@ -1445,7 +1812,11 @@ "website": "https://actualbudget.org", "docs": "https://actualbudget.org/docs" }, - "tags": ["budgeting", "finance", "money"] + "tags": [ + "budgeting", + "finance", + "money" + ] }, { "id": "conduit", @@ -1458,7 +1829,10 @@ "website": "https://conduit.rs/", "docs": "https://docs.conduit.rs/" }, - "tags": ["matrix", "communication"] + "tags": [ + "matrix", + "communication" + ] }, { "id": "evolutionapi", @@ -1471,7 +1845,11 @@ "docs": "https://doc.evolution-api.com/v2/en/get-started/introduction", "website": "https://evolution-api.com/opensource-whatsapp-api/" }, - "tags": ["api", "whatsapp", "messaging"] + "tags": [ + "api", + "whatsapp", + "messaging" + ] }, { "id": "conduwuit", @@ -1484,7 +1862,13 @@ "website": "https://conduwuit.puppyirl.gay", "docs": "https://conduwuit.puppyirl.gay/configuration.html" }, - "tags": ["backend", "chat", "communication", "matrix", "server"] + "tags": [ + "backend", + "chat", + "communication", + "matrix", + "server" + ] }, { "id": "cloudflared", @@ -1497,7 +1881,12 @@ "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"] + "tags": [ + "cloud", + "networking", + "security", + "tunnel" + ] }, { "id": "couchdb", @@ -1510,7 +1899,10 @@ "website": "https://couchdb.apache.org/", "docs": "https://docs.couchdb.org/en/stable/" }, - "tags": ["database", "storage"] + "tags": [ + "database", + "storage" + ] }, { "id": "it-tools", @@ -1523,7 +1915,10 @@ "website": "https://it-tools.tech", "docs": "https://it-tools.tech/docs" }, - "tags": ["developer", "tools"] + "tags": [ + "developer", + "tools" + ] }, { "id": "superset", @@ -1536,7 +1931,13 @@ "website": "https://superset.apache.org", "docs": "https://superset.apache.org/docs/intro" }, - "tags": ["analytics", "bi", "dashboard", "database", "sql"] + "tags": [ + "analytics", + "bi", + "dashboard", + "database", + "sql" + ] }, { "id": "glance", @@ -1549,7 +1950,12 @@ "docs": "https://github.com/glanceapp/glance/blob/main/docs/configuration.md", "website": "https://glance.app/" }, - "tags": ["dashboard", "monitoring", "widgets", "rss"] + "tags": [ + "dashboard", + "monitoring", + "widgets", + "rss" + ] }, { "id": "homarr", @@ -1562,7 +1968,10 @@ "docs": "https://homarr.dev/docs/getting-started/installation/docker", "website": "https://homarr.dev/" }, - "tags": ["dashboard", "monitoring"] + "tags": [ + "dashboard", + "monitoring" + ] }, { "id": "erpnext", @@ -1596,7 +2005,10 @@ "website": "https://maybe.finance/", "docs": "https://docs.maybe.finance/" }, - "tags": ["finance", "self-hosted"] + "tags": [ + "finance", + "self-hosted" + ] }, { "id": "spacedrive", @@ -1609,7 +2021,11 @@ "docs": "https://www.spacedrive.com/docs/product/getting-started/introduction" }, "logo": "spacedrive.png", - "tags": ["file-manager", "vdfs", "storage"] + "tags": [ + "file-manager", + "vdfs", + "storage" + ] }, { "id": "registry", @@ -1622,7 +2038,11 @@ "docs": "https://distribution.github.io/distribution/" }, "logo": "registry.png", - "tags": ["registry", "docker", "self-hosted"] + "tags": [ + "registry", + "docker", + "self-hosted" + ] }, { "id": "alist", @@ -1635,7 +2055,11 @@ "website": "https://alist.nn.ci", "docs": "https://alist.nn.ci/guide/install/docker.html" }, - "tags": ["file", "webdav", "storage"] + "tags": [ + "file", + "webdav", + "storage" + ] }, { "id": "answer", @@ -1648,7 +2072,10 @@ "website": "https://answer.apache.org/", "docs": "https://answer.apache.org/docs" }, - "tags": ["q&a", "self-hosted"] + "tags": [ + "q&a", + "self-hosted" + ] }, { "id": "shlink", @@ -1661,7 +2088,11 @@ "website": "https://shlink.io", "docs": "https://shlink.io/documentation" }, - "tags": ["sharing", "shortener", "url"] + "tags": [ + "sharing", + "shortener", + "url" + ] }, { "id": "frappe-hr", @@ -1694,7 +2125,10 @@ "website": "https://formbricks.com/", "docs": "https://formbricks.com/docs" }, - "tags": ["forms", "analytics"] + "tags": [ + "forms", + "analytics" + ] }, { "id": "trilium", @@ -1707,7 +2141,11 @@ "website": "https://github.com/zadam/trilium", "docs": "https://github.com/zadam/trilium/wiki/" }, - "tags": ["self-hosted", "productivity", "personal-use"] + "tags": [ + "self-hosted", + "productivity", + "personal-use" + ] }, { "id": "convex", @@ -1720,7 +2158,11 @@ "website": "https://www.convex.dev/", "docs": "https://www.convex.dev/docs" }, - "tags": ["backend", "database", "api"] + "tags": [ + "backend", + "database", + "api" + ] }, { "id": "wikijs", @@ -1733,7 +2175,11 @@ "website": "https://js.wiki/", "docs": "https://docs.requarks.io/" }, - "tags": ["knowledge-base", "self-hosted", "documentation"] + "tags": [ + "knowledge-base", + "self-hosted", + "documentation" + ] }, { "id": "otterwiki", @@ -1746,7 +2192,12 @@ "website": "https://otterwiki.com/", "docs": "https://github.com/redimp/otterwiki/wiki" }, - "tags": ["wiki", "documentation", "knowledge-base", "markdown"] + "tags": [ + "wiki", + "documentation", + "knowledge-base", + "markdown" + ] }, { "id": "lowcoder", @@ -1759,7 +2210,11 @@ "website": "https://www.lowcoder.cloud/", "docs": "https://docs.lowcoder.cloud/lowcoder-documentation" }, - "tags": ["low-code", "no-code", "development"] + "tags": [ + "low-code", + "no-code", + "development" + ] }, { "id": "backrest", @@ -1772,7 +2227,9 @@ "docs": "https://garethgeorge.github.io/backrest/introduction/getting-started" }, "logo": "backrest.svg", - "tags": ["backup"] + "tags": [ + "backup" + ] }, { "id": "blinko", @@ -1785,7 +2242,12 @@ "website": "https://blinko.space/", "docs": "https://docs.blinko.space/" }, - "tags": ["productivity", "organization", "workflow", "nextjs"] + "tags": [ + "productivity", + "organization", + "workflow", + "nextjs" + ] }, { "id": "pgadmin", @@ -1798,7 +2260,11 @@ "docs": "https://www.pgadmin.org/docs/" }, "logo": "pgadmin.webp", - "tags": ["database", "postgres", "admin"] + "tags": [ + "database", + "postgres", + "admin" + ] }, { "id": "ackee", @@ -1811,7 +2277,10 @@ "website": "https://ackee.electerious.com/", "docs": "https://docs.ackee.electerious.com/" }, - "tags": ["analytics", "self-hosted"] + "tags": [ + "analytics", + "self-hosted" + ] }, { "id": "adguardhome", @@ -1824,7 +2293,12 @@ "website": "https://adguard.com", "docs": "https://github.com/AdguardTeam/AdGuardHome/wiki" }, - "tags": ["privacy", "security", "dns", "ad-blocking"] + "tags": [ + "privacy", + "security", + "dns", + "ad-blocking" + ] }, { "id": "adminer", @@ -1837,7 +2311,12 @@ "website": "https://www.adminer.org/", "docs": "https://www.adminer.org/en/plugins/" }, - "tags": ["databases", "developer-tools", "mysql", "postgresql"] + "tags": [ + "databases", + "developer-tools", + "mysql", + "postgresql" + ] }, { "id": "affinepro", @@ -1868,7 +2347,11 @@ "website": "https://github.com/Rudloff/alltube", "docs": "https://github.com/Rudloff/alltube/wiki" }, - "tags": ["media", "video", "downloader"] + "tags": [ + "media", + "video", + "downloader" + ] }, { "id": "ampache", @@ -1881,7 +2364,11 @@ "website": "http://ampache.org/", "docs": "https://github.com/ampache/ampache/wiki" }, - "tags": ["media", "music", "streaming"] + "tags": [ + "media", + "music", + "streaming" + ] }, { "id": "anythingllm", @@ -1894,7 +2381,11 @@ "website": "https://useanything.com", "docs": "https://github.com/Mintplex-Labs/anything-llm/tree/master/docs" }, - "tags": ["ai", "llm", "chatbot"] + "tags": [ + "ai", + "llm", + "chatbot" + ] }, { "id": "apprise-api", @@ -1907,7 +2398,10 @@ "website": "https://github.com/caronc/apprise-api", "docs": "https://github.com/caronc/apprise-api/wiki" }, - "tags": ["notifications", "api"] + "tags": [ + "notifications", + "api" + ] }, { "id": "arangodb", @@ -1920,7 +2414,11 @@ "website": "https://www.arangodb.com/", "docs": "https://www.arangodb.com/docs/" }, - "tags": ["database", "graph-database", "nosql"] + "tags": [ + "database", + "graph-database", + "nosql" + ] }, { "id": "anonupload", @@ -1933,7 +2431,10 @@ "docs": "https://github.com/Supernova3339/anonupload/blob/main/env.md", "website": "https://anonupload.com/" }, - "tags": ["file-sharing", "privacy"] + "tags": [ + "file-sharing", + "privacy" + ] }, { "id": "argilla", @@ -1946,7 +2447,11 @@ "website": "https://www.argilla.io/", "docs": "https://docs.argilla.io/" }, - "tags": ["machine-learning", "data-labeling", "ai"] + "tags": [ + "machine-learning", + "data-labeling", + "ai" + ] }, { "id": "audiobookshelf", @@ -1959,7 +2464,11 @@ "website": "https://www.audiobookshelf.org", "docs": "https://www.audiobookshelf.org/docs" }, - "tags": ["media", "audiobooks", "podcasts"] + "tags": [ + "media", + "audiobooks", + "podcasts" + ] }, { "id": "authorizer", @@ -1972,7 +2481,11 @@ "website": "https://authorizer.dev", "docs": "https://docs.authorizer.dev/" }, - "tags": ["authentication", "authorization", "security"] + "tags": [ + "authentication", + "authorization", + "security" + ] }, { "id": "automatisch", @@ -1985,7 +2498,11 @@ "website": "https://automatisch.io/docs", "docs": "https://automatisch.io/docs" }, - "tags": ["automation", "workflow", "integration"] + "tags": [ + "automation", + "workflow", + "integration" + ] }, { "id": "babybuddy", @@ -1998,7 +2515,11 @@ "website": "https://babybuddy.app", "docs": "https://docs.babybuddy.app" }, - "tags": ["parenting", "tracking", "family"] + "tags": [ + "parenting", + "tracking", + "family" + ] }, { "id": "baikal", @@ -2011,7 +2532,12 @@ "github": "https://sabre.io/baikal/", "docs": "https://sabre.io/baikal/install/" }, - "tags": ["calendar", "contacts", "caldav", "carddav"] + "tags": [ + "calendar", + "contacts", + "caldav", + "carddav" + ] }, { "id": "barrage", @@ -2024,7 +2550,11 @@ "website": "https://github.com/maulik9898/barrage", "docs": "https://github.com/maulik9898/barrage/blob/main/README.md" }, - "tags": ["torrents", "deluge", "mobile"] + "tags": [ + "torrents", + "deluge", + "mobile" + ] }, { "id": "bazarr", @@ -2037,7 +2567,11 @@ "website": "https://www.bazarr.media/", "docs": "https://www.bazarr.media/docs" }, - "tags": ["subtitles", "sonarr", "radarr"] + "tags": [ + "subtitles", + "sonarr", + "radarr" + ] }, { "id": "beszel", @@ -2050,7 +2584,11 @@ "website": "https://beszel.dev", "docs": "https://beszel.dev/guide/getting-started" }, - "tags": ["monitoring", "docker", "alerts"] + "tags": [ + "monitoring", + "docker", + "alerts" + ] }, { "id": "bytestash", @@ -2063,7 +2601,10 @@ "website": "https://bytestash.com", "docs": "https://bytestash.com/docs" }, - "tags": ["file-storage", "self-hosted"] + "tags": [ + "file-storage", + "self-hosted" + ] }, { "id": "bookstack", @@ -2076,7 +2617,10 @@ "website": "https://www.bookstackapp.com", "docs": "https://www.bookstackapp.com/docs" }, - "tags": ["documentation", "self-hosted"] + "tags": [ + "documentation", + "self-hosted" + ] }, { "id": "bytebase", @@ -2089,7 +2633,10 @@ "website": "https://www.bytebase.com", "docs": "https://www.bytebase.com/docs" }, - "tags": ["database", "self-hosted"] + "tags": [ + "database", + "self-hosted" + ] }, { "id": "botpress", @@ -2102,7 +2649,10 @@ "website": "https://botpress.com", "docs": "https://botpress.com/docs" }, - "tags": ["ai", "self-hosted"] + "tags": [ + "ai", + "self-hosted" + ] }, { "id": "calibre", @@ -2115,7 +2665,10 @@ "website": "https://calibre-ebook.com/", "docs": "https://manual.calibre-ebook.com/" }, - "tags": ["Documents", "E-Commerce"] + "tags": [ + "Documents", + "E-Commerce" + ] }, { "id": "carbone", @@ -2128,7 +2681,12 @@ "website": "https://carbone.io/", "docs": "https://carbone.io/documentation/design/overview/getting-started.html" }, - "tags": ["Document Generation", "Automation", "Reporting", "Productivity"] + "tags": [ + "Document Generation", + "Automation", + "Reporting", + "Productivity" + ] }, { "id": "casdoor", @@ -2164,7 +2722,11 @@ "website": "https://changedetection.io", "docs": "https://github.com/dgtlmoon/changedetection.io/wiki" }, - "tags": ["Monitoring", "Data", "Notifications"] + "tags": [ + "Monitoring", + "Data", + "Notifications" + ] }, { "id": "chevereto", @@ -2215,7 +2777,11 @@ "website": "https://www.classicpress.net/", "docs": "https://docs.classicpress.net/" }, - "tags": ["cms", "wordpress", "content-management"] + "tags": [ + "cms", + "wordpress", + "content-management" + ] }, { "id": "cloud9", @@ -2228,7 +2794,11 @@ "website": "https://aws.amazon.com/cloud9/", "docs": "https://docs.aws.amazon.com/cloud9/" }, - "tags": ["ide", "development", "cloud"] + "tags": [ + "ide", + "development", + "cloud" + ] }, { "id": "cloudcommander", @@ -2241,7 +2811,11 @@ "website": "https://cloudcmd.io", "docs": "https://cloudcmd.io/#install" }, - "tags": ["file-manager", "web-based", "console"] + "tags": [ + "file-manager", + "web-based", + "console" + ] }, { "id": "cockpit", @@ -2254,7 +2828,11 @@ "website": "https://getcockpit.com", "docs": "https://getcockpit.com/documentation" }, - "tags": ["cms", "content-management", "api"] + "tags": [ + "cms", + "content-management", + "api" + ] }, { "id": "chromium", @@ -2267,7 +2845,11 @@ "docs": "https://docs.linuxserver.io/images/docker-chromium", "website": "https://docs.linuxserver.io/images/docker-chromium" }, - "tags": ["browser", "development", "web"] + "tags": [ + "browser", + "development", + "web" + ] }, { "id": "codex-docs", @@ -2280,7 +2862,11 @@ "website": "https://codex.so", "docs": "https://docs.codex.so" }, - "tags": ["documentation", "development", "collaboration"] + "tags": [ + "documentation", + "development", + "collaboration" + ] }, { "id": "colanode", @@ -2293,7 +2879,11 @@ "website": "https://colanode.com", "docs": "https://colanode.com/docs/" }, - "tags": ["documentation", "knowledge-base", "collaboration"] + "tags": [ + "documentation", + "knowledge-base", + "collaboration" + ] }, { "id": "collabora-office", @@ -2306,7 +2896,11 @@ "website": "https://collaboraonline.com", "docs": "https://sdk.collaboraonline.com/docs" }, - "tags": ["office", "documents", "collaboration"] + "tags": [ + "office", + "documents", + "collaboration" + ] }, { "id": "confluence", @@ -2337,7 +2931,11 @@ "github": "https://github.com/souramoo/commentoplusplus" }, "logo": "logo.png", - "tags": ["comments", "discussion", "website"] + "tags": [ + "comments", + "discussion", + "website" + ] }, { "id": "commentoplusplus", @@ -2350,7 +2948,11 @@ "github": "https://github.com/souramoo/commentoplusplus" }, "logo": "logo.png", - "tags": ["comments", "website", "open-source"] + "tags": [ + "comments", + "website", + "open-source" + ] }, { "id": "coralproject", @@ -2363,7 +2965,11 @@ "github": "https://github.com/coralproject/talk" }, "logo": "logo.png", - "tags": ["communication", "community", "privacy"] + "tags": [ + "communication", + "community", + "privacy" + ] }, { "id": "rsshub", @@ -2376,7 +2982,11 @@ "website": "https://rsshub.app/", "docs": "https://docs.rsshub.app/" }, - "tags": ["rss", "api", "self-hosted"] + "tags": [ + "rss", + "api", + "self-hosted" + ] }, { "id": "tailscale-exitnode", @@ -2389,7 +2999,9 @@ "website": "https://tailscale.com/", "docs": "https://tailscale.com/kb/1408/quick-guide-exit-nodes" }, - "tags": ["network"] + "tags": [ + "network" + ] }, { "id": "homebridge", @@ -2402,7 +3014,13 @@ "website": "https://homebridge.io/", "docs": "https://github.com/homebridge/homebridge/wiki" }, - "tags": ["iot", "homekit", "internet-of-things", "self-hosted", "server"] + "tags": [ + "iot", + "homekit", + "internet-of-things", + "self-hosted", + "server" + ] }, { "id": "homeassistant", @@ -2434,7 +3052,11 @@ "website": "https://tooljet.ai/", "docs": "https://docs.tooljet.ai/" }, - "tags": ["file-sync", "file-sharing", "self-hosted"] + "tags": [ + "file-sync", + "file-sharing", + "self-hosted" + ] }, { "id": "onetimesecret", @@ -2447,7 +3069,12 @@ "website": "https://onetimesecret.com", "docs": "https://docs.onetimesecret.com" }, - "tags": ["auth", "password", "secret", "secure"] + "tags": [ + "auth", + "password", + "secret", + "secure" + ] }, { "id": "bugsink", @@ -2460,7 +3087,11 @@ "website": "https://www.bugsink.com/", "docs": "https://www.bugsink.com/docs/" }, - "tags": ["hosting", "self-hosted", "development"] + "tags": [ + "hosting", + "self-hosted", + "development" + ] }, { "id": "bolt.diy", @@ -2473,7 +3104,14 @@ "website": "https://stackblitz-labs.github.io/bolt.diy/", "docs": "https://stackblitz-labs.github.io/bolt.diy/" }, - "tags": ["ai", "self-hosted", "development", "chatbot", "ide", "llm"] + "tags": [ + "ai", + "self-hosted", + "development", + "chatbot", + "ide", + "llm" + ] }, { "id": "qdrant", @@ -2486,7 +3124,11 @@ "website": "https://qdrant.tech/", "docs": "https://qdrant.tech/documentation/" }, - "tags": ["vector-db", "database", "search"] + "tags": [ + "vector-db", + "database", + "search" + ] }, { "id": "trmnl-byos-laravel", @@ -2499,7 +3141,9 @@ "website": "https://docs.usetrmnl.com/go/diy/byos", "docs": "https://github.com/usetrmnl/byos_laravel/blob/main/README.md" }, - "tags": ["e-ink"] + "tags": [ + "e-ink" + ] }, { "id": "chibisafe", @@ -2512,7 +3156,11 @@ "website": "https://chibisafe.app", "docs": "https://chibisafe.app/docs/intro" }, - "tags": ["media system", "storage", "file-sharing"] + "tags": [ + "media system", + "storage", + "file-sharing" + ] }, { "id": "rybbit", @@ -2525,7 +3173,9 @@ "website": "https://rybbit.io", "docs": "https://www.rybbit.io/docs" }, - "tags": ["analytics"] + "tags": [ + "analytics" + ] }, { "id": "seafile", @@ -2538,7 +3188,11 @@ "website": "https://seafile.com", "docs": "https://manual.seafile.com/12.0" }, - "tags": ["file-manager", "file-sharing", "storage"] + "tags": [ + "file-manager", + "file-sharing", + "storage" + ] }, { "id": "flagsmith", @@ -2569,7 +3223,9 @@ "website": "https://www.docuseal.com/", "docs": "https://www.docuseal.com/" }, - "tags": ["document-signing"] + "tags": [ + "document-signing" + ] }, { "id": "kutt", @@ -2582,7 +3238,10 @@ "website": "https://kutt.it", "docs": "https://github.com/thedevs-network/kutt#kuttit" }, - "tags": ["link-shortener", "link-sharing"] + "tags": [ + "link-shortener", + "link-sharing" + ] }, { "id": "kener", @@ -2595,7 +3254,12 @@ "website": "https://kener.ing/", "docs": "https://kener.ing/docs/" }, - "tags": ["monitoring", "status-page", "alerting", "self-hosted"] + "tags": [ + "monitoring", + "status-page", + "alerting", + "self-hosted" + ] }, { "id": "palmr", @@ -2608,7 +3272,11 @@ "website": "https://palmr.kyantech.com.br/", "docs": "https://palmr.kyantech.com.br/docs/3.0-beta" }, - "tags": ["file-sharing", "self-hosted", "open-source"] + "tags": [ + "file-sharing", + "self-hosted", + "open-source" + ] }, { "id": "karakeep", @@ -2690,7 +3358,12 @@ "website": "https://github.com/aldinokemal/go-whatsapp-web-multidevice", "docs": "https://github.com/aldinokemal/go-whatsapp-web-multidevice" }, - "tags": ["whatsapp", "self-hosted", "open-source", "api"] + "tags": [ + "whatsapp", + "self-hosted", + "open-source", + "api" + ] }, { "id": "rabbitmq", @@ -2703,7 +3376,11 @@ "website": "https://www.rabbitmq.com/", "docs": "https://www.rabbitmq.com/documentation.html" }, - "tags": ["message-broker", "queue", "rabbitmq"] + "tags": [ + "message-broker", + "queue", + "rabbitmq" + ] }, { "id": "ezbookkeeping", @@ -2759,7 +3436,11 @@ "website": "https://gchq.github.io/CyberChef/", "docs": "https://github.com/gchq/CyberChef/wiki" }, - "tags": ["security", "encryption", "data-analysis"] + "tags": [ + "security", + "encryption", + "data-analysis" + ] }, { "id": "filestash", @@ -2772,7 +3453,11 @@ "website": "https://www.filestash.app/", "docs": "https://www.filestash.app/docs/" }, - "tags": ["file-manager", "document-editor", "self-hosted"] + "tags": [ + "file-manager", + "document-editor", + "self-hosted" + ] }, { "id": "mazanoke", @@ -2785,7 +3470,13 @@ "website": "https://github.com/civilblur/mazanoke", "docs": "https://github.com/civilblur/mazanoke" }, - "tags": ["image-hosting", "file-sharing", "self-hosted", "media", "gallery"] + "tags": [ + "image-hosting", + "file-sharing", + "self-hosted", + "media", + "gallery" + ] }, { "id": "ihatemoney", @@ -2837,7 +3528,12 @@ "website": "https://gitlab.com/", "docs": "https://docs.gitlab.com/ee/" }, - "tags": ["git", "ci-cd", "version-control", "project-management"] + "tags": [ + "git", + "ci-cd", + "version-control", + "project-management" + ] }, { "id": "memos", @@ -2855,5 +3551,24 @@ "notes", "bookmarks" ] + }, + { + "id": "keycloak", + "name": "Keycloak", + "version": "26.0", + "description": "Keycloak is an open source Identity and Access Management solution for modern applications and services.", + "logo": "keycloak.svg", + "links": { + "github": "https://github.com/keycloak/keycloak", + "website": "https://www.keycloak.org/", + "docs": "https://www.keycloak.org/documentation" + }, + "tags": [ + "authentication", + "identity", + "sso", + "oauth2", + "openid-connect" + ] } -] +] \ No newline at end of file