From e83a6cc569ae7bdab9eec39cc112035b8d29615f Mon Sep 17 00:00:00 2001 From: Tony Hart <154579112+thaarrtt@users.noreply.github.com> Date: Mon, 7 Jul 2025 10:14:02 +0700 Subject: [PATCH] add casdoor template (#213) * add casdoor template * fix icon * improve default admin passwd * improve casdoor init json * add env * try fix origin url behind traefik * try fix https * test configurable host/domain * more consistent domain var * change host env var * to fix well know open id is manually editing the config file * remove default defined dokploy network --- blueprints/casdoor/casdoor.png | Bin 0 -> 72204 bytes blueprints/casdoor/docker-compose.yml | 33 + blueprints/casdoor/template.toml | 533 +++++++++++++ meta.json | 1036 ++++++++++++++++++++----- 4 files changed, 1420 insertions(+), 182 deletions(-) create mode 100644 blueprints/casdoor/casdoor.png create mode 100644 blueprints/casdoor/docker-compose.yml create mode 100644 blueprints/casdoor/template.toml diff --git a/blueprints/casdoor/casdoor.png b/blueprints/casdoor/casdoor.png new file mode 100644 index 0000000000000000000000000000000000000000..2ee7e700985ac8eca582242b0e83e07ab0ad122c GIT binary patch literal 72204 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 literal 0 HcmV?d00001 diff --git a/blueprints/casdoor/docker-compose.yml b/blueprints/casdoor/docker-compose.yml new file mode 100644 index 00000000..6cc1c07e --- /dev/null +++ b/blueprints/casdoor/docker-compose.yml @@ -0,0 +1,33 @@ +services: + casdoor: + image: casbin/casdoor:latest + environment: + - RUNNING_IN_DOCKER=true + volumes: + - ../files/app.conf:/conf/app.conf + - ../files/init_data.json:/init_data.json + - casdoor-data:/data + depends_on: + casdoor-db: + condition: service_healthy + restart: unless-stopped + + casdoor-db: + image: postgres:16 + environment: + - POSTGRES_USER=casdoor + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + - POSTGRES_DB=casdoor + volumes: + - casdoor-postgres-data:/var/lib/postgresql/data + restart: unless-stopped + healthcheck: + test: ["CMD-SHELL", "pg_isready -U casdoor -d casdoor"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s + +volumes: + casdoor-postgres-data: + casdoor-data: \ No newline at end of file diff --git a/blueprints/casdoor/template.toml b/blueprints/casdoor/template.toml new file mode 100644 index 00000000..e1215b96 --- /dev/null +++ b/blueprints/casdoor/template.toml @@ -0,0 +1,533 @@ +[variables] +postgres_password = "${password:32}" +admin_password = "${password:16}" +jwt_secret = "${password:64}" +main_domain = "${domain}" + +[config] +[[config.domains]] +serviceName = "casdoor" +port = 8000 +host = "${main_domain}" + +[config.env] +POSTGRES_PASSWORD = "${postgres_password}" +ADMIN_FIRST_LOGIN_PASSWD = "${admin_password}" + +[[config.mounts]] +filePath = "app.conf" +content = """ +appname = casdoor +httpport = 8000 +runmode = prod +SessionOn = true +copyrequestbody = true +driverName = postgres +dataSourceName = user=casdoor password=${postgres_password} host=casdoor-db port=5432 sslmode=disable dbname=casdoor +dbName = casdoor +showSql = false +redisEndpoint = +defaultStorageProvider = +isCloudIntranet = false +authState = "casdoor" +socks5Proxy = "127.0.0.1:10808" +verificationCodeTimeout = 10 +initData = "./init_data.json" +logPostOnly = true +isUsernameLowered = false +origin = "https://${main_domain}" +staticBaseUrl = "https://cdn.casbin.org" +isDemoMode = false +batchSize = 100 +enableGzip = true +ldapServerPort = 389 +radiusServerPort = 1812 +radiusSecret = "secret" +quota = {"organization": -1, "user": -1, "application": -1, "provider": -1} +logConfig = {"filename": "logs/casdoor.log", "maxdays":99999, "perm":"0770"} +initDataFile = "./init_data.json" +frontendBaseDir = "../web/build" +""" + +[[config.mounts]] +filePath = "init_data.json" +content = """ +{ + "organizations": [ + { + "owner": "admin", + "name": "built-in", + "createdTime": "2021-01-01T00:00:00Z", + "displayName": "Built-in Organization", + "websiteUrl": "https://casdoor.org", + "favicon": "https://cdn.casbin.org/img/casbin/favicon.ico", + "passwordType": "plain", + "passwordOptions": ["AtLeast6"], + "countryCode": "US", + "defaultAvatar": "https://cdn.casbin.org/img/casbin/user.png", + "defaultApplication": "app-built-in", + "tags": [], + "languages": ["en"], + "themeData": { + "isCompact": false, + "isEnabled": false, + "themeType": "default", + "colorPrimary": "#1976d2", + "borderRadius": 6, + "isRoundedButton": false, + "isGradientButton": false, + "themeAlgorithm": "default" + }, + "masterPassword": "", + "initScore": 2000, + "enableSoftDeletion": false, + "isProfilePublic": false, + "mfaItems": [], + "accountItems": [ + { + "name": "Organization", + "visible": true, + "viewRule": "Public", + "modifyRule": "Admin" + }, + { + "name": "ID", + "visible": true, + "viewRule": "Public", + "modifyRule": "Immutable" + }, + { + "name": "Name", + "visible": true, + "viewRule": "Public", + "modifyRule": "Admin" + }, + { + "name": "Display name", + "visible": true, + "viewRule": "Public", + "modifyRule": "Self" + }, + { + "name": "Avatar", + "visible": true, + "viewRule": "Public", + "modifyRule": "Self" + }, + { + "name": "User type", + "visible": true, + "viewRule": "Public", + "modifyRule": "Admin" + }, + { + "name": "Password", + "visible": true, + "viewRule": "Self", + "modifyRule": "Self" + }, + { + "name": "Email", + "visible": true, + "viewRule": "Public", + "modifyRule": "Self" + }, + { + "name": "Phone", + "visible": true, + "viewRule": "Public", + "modifyRule": "Self" + }, + { + "name": "Country/Region", + "visible": true, + "viewRule": "Public", + "modifyRule": "Self" + }, + { + "name": "Location", + "visible": true, + "viewRule": "Public", + "modifyRule": "Self" + }, + { + "name": "Affiliation", + "visible": true, + "viewRule": "Public", + "modifyRule": "Self" + }, + { + "name": "Title", + "visible": true, + "viewRule": "Public", + "modifyRule": "Self" + }, + { + "name": "Homepage", + "visible": true, + "viewRule": "Public", + "modifyRule": "Self" + }, + { + "name": "Bio", + "visible": true, + "viewRule": "Public", + "modifyRule": "Self" + }, + { + "name": "Tag", + "visible": true, + "viewRule": "Public", + "modifyRule": "Admin" + }, + { + "name": "Language", + "visible": true, + "viewRule": "Public", + "modifyRule": "Self" + }, + { + "name": "Gender", + "visible": true, + "viewRule": "Public", + "modifyRule": "Self" + }, + { + "name": "Birthday", + "visible": true, + "viewRule": "Public", + "modifyRule": "Self" + }, + { + "name": "Education", + "visible": true, + "viewRule": "Public", + "modifyRule": "Self" + }, + { + "name": "Score", + "visible": true, + "viewRule": "Public", + "modifyRule": "Admin" + }, + { + "name": "Karma", + "visible": true, + "viewRule": "Public", + "modifyRule": "Admin" + }, + { + "name": "Ranking", + "visible": true, + "viewRule": "Public", + "modifyRule": "Admin" + }, + { + "name": "Signup application", + "visible": true, + "viewRule": "Public", + "modifyRule": "Admin" + }, + { + "name": "Roles", + "visible": true, + "viewRule": "Public", + "modifyRule": "Immutable" + }, + { + "name": "Permissions", + "visible": true, + "viewRule": "Public", + "modifyRule": "Immutable" + }, + { + "name": "Groups", + "visible": true, + "viewRule": "Public", + "modifyRule": "Admin" + }, + { + "name": "3rd-party logins", + "visible": true, + "viewRule": "Self", + "modifyRule": "Self" + }, + { + "name": "Properties", + "visible": false, + "viewRule": "Admin", + "modifyRule": "Admin" + }, + { + "name": "Is admin", + "visible": true, + "viewRule": "Admin", + "modifyRule": "Admin" + }, + { + "name": "Is forbidden", + "visible": true, + "viewRule": "Admin", + "modifyRule": "Admin" + }, + { + "name": "Is deleted", + "visible": true, + "viewRule": "Admin", + "modifyRule": "Admin" + }, + { + "name": "Multi-factor authentication", + "visible": true, + "viewRule": "Self", + "modifyRule": "Self" + }, + { + "name": "WebAuthn credentials", + "visible": true, + "viewRule": "Self", + "modifyRule": "Self" + }, + { + "name": "Managed accounts", + "visible": true, + "viewRule": "Self", + "modifyRule": "Self" + } + ] + } + ], + "users": [ + { + "owner": "built-in", + "name": "admin", + "createdTime": "2021-01-01T00:00:00Z", + "updatedTime": "2021-01-01T00:00:00Z", + "id": "admin", + "type": "normal-user", + "password": "${admin_password}", + "passwordSalt": "", + "displayName": "Admin", + "firstName": "", + "lastName": "", + "avatar": "https://cdn.casbin.org/img/casbin/user.png", + "permanentAvatar": "", + "email": "admin@example.com", + "emailVerified": true, + "phone": "", + "location": "", + "address": [], + "affiliation": "Example Inc.", + "title": "Administrator", + "idCardType": "", + "idCard": "", + "homepage": "", + "bio": "", + "tag": "staff", + "region": "US", + "language": "en", + "gender": "", + "birthday": "", + "education": "", + "score": 2000, + "karma": 0, + "ranking": 1, + "isDefaultAvatar": false, + "isOnline": false, + "isAdmin": true, + "isGlobalAdmin": true, + "isForbidden": false, + "isDeleted": false, + "signupApplication": "app-built-in", + "hash": "", + "preHash": "", + "createdIp": "", + "lastSigninTime": "", + "lastSigninIp": "", + "github": "", + "google": "", + "qq": "", + "wechat": "", + "facebook": "", + "dingtalk": "", + "weibo": "", + "gitee": "", + "linkedin": "", + "wecom": "", + "lark": "", + "gitlab": "", + "adfs": "", + "baidu": "", + "alipay": "", + "casdoor": "", + "infoflow": "", + "apple": "", + "azuread": "", + "slack": "", + "steam": "", + "bilibili": "", + "okta": "", + "douyin": "", + "custom": "", + "webauthnCredentials": [], + "preferredMfaType": "", + "recoveryCodes": [], + "totpSecret": "", + "mfaPhoneEnabled": false, + "mfaEmailEnabled": false, + "ldap": "", + "properties": {}, + "roles": [], + "permissions": [], + "groups": [], + "lastSigninWrongTime": "", + "signinWrongTimes": 0, + "managedAccounts": [] + } + ], + "applications": [ + { + "owner": "built-in", + "name": "app-built-in", + "createdTime": "2021-01-01T00:00:00Z", + "displayName": "Casdoor", + "logo": "https://cdn.casbin.org/img/casbin/favicon.ico", + "homepageUrl": "https://${main_domain}", + "description": "Casdoor - A UI-first Identity Access Management (IAM) / Single-Sign-On (SSO) platform", + "organization": "built-in", + "cert": "", + "enablePassword": true, + "enableSignUp": true, + "enableSigninSession": false, + "enableAutoSignin": false, + "enableCodeSignin": false, + "enableSamlCompress": false, + "enableWebAuthn": false, + "enableLinkWithEmail": false, + "samlReplyUrl": "", + "providers": [], + "signupItems": [ + { + "name": "ID", + "visible": false, + "required": true, + "prompted": false, + "rule": "Random" + }, + { + "name": "Username", + "visible": true, + "required": true, + "prompted": false, + "rule": "None" + }, + { + "name": "Display name", + "visible": true, + "required": true, + "prompted": false, + "rule": "None" + }, + { + "name": "Password", + "visible": true, + "required": true, + "prompted": false, + "rule": "None" + }, + { + "name": "Confirm password", + "visible": true, + "required": true, + "prompted": false, + "rule": "None" + }, + { + "name": "Email", + "visible": true, + "required": true, + "prompted": false, + "rule": "None" + }, + { + "name": "Phone", + "visible": true, + "required": true, + "prompted": false, + "rule": "None" + }, + { + "name": "Agreement", + "visible": true, + "required": true, + "prompted": false, + "rule": "None" + } + ], + "grantTypes": [ + "authorization_code", + "password", + "client_credentials", + "token", + "id_token" + ], + "organizationObj": { + "owner": "admin", + "name": "built-in", + "createdTime": "2021-01-01T00:00:00Z", + "displayName": "Built-in Organization" + }, + "tags": [], + "clientId": "${jwt_secret}", + "clientSecret": "${jwt_secret}", + "redirectUris": ["https://${main_domain}/callback"], + "tokenFormat": "JWT", + "tokenFields": [], + "expireInHours": 168, + "refreshExpireInHours": 168, + "signupUrl": "", + "signinUrl": "", + "forgetUrl": "", + "affiliationUrl": "", + "termsOfUse": "", + "privacyPolicy": "", + "tokenFields": [], + "themeData": { + "isCompact": false, + "isEnabled": false, + "themeType": "default", + "colorPrimary": "#1976d2", + "borderRadius": 6, + "isRoundedButton": false, + "isGradientButton": false, + "themeAlgorithm": "default" + }, + "formCss": "", + "formCssMobile": "", + "formOffset": 2, + "formSideHtml": "", + "formBackgroundUrl": "" + } + ], + "certs": [], + "providers": [], + "ldaps": [], + "models": [], + "permissions": [], + "roles": [], + "groups": [], + "enforcers": [], + "tokens": [], + "sessions": [], + "payments": [], + "products": [], + "resources": [], + "synceers": [], + "adapters": [], + "webhooks": [], + "subscriptions": [], + "plans": [], + "pricings": [], + "invitations": [] +} +""" diff --git a/meta.json b/meta.json index 56240bb6..501795ef 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": "freescout", @@ -23,7 +28,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", @@ -36,7 +47,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", @@ -49,7 +67,11 @@ "docs": "https://appwrite.io/docs" }, "logo": "appwrite.svg", - "tags": ["database", "firebase", "postgres"] + "tags": [ + "database", + "firebase", + "postgres" + ] }, { "id": "outline", @@ -62,7 +84,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", @@ -75,7 +101,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" }, { @@ -89,7 +119,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" }, { @@ -103,7 +137,11 @@ "website": "https://pocketbase.io/", "docs": "https://pocketbase.io/docs/" }, - "tags": ["backend", "database", "api"] + "tags": [ + "backend", + "database", + "api" + ] }, { "id": "plausible", @@ -116,7 +154,9 @@ "website": "https://plausible.io/", "docs": "https://plausible.io/docs" }, - "tags": ["analytics"] + "tags": [ + "analytics" + ] }, { "id": "calcom", @@ -129,7 +169,10 @@ "docs": "https://cal.com/docs" }, "logo": "calcom.jpg", - "tags": ["scheduling", "booking"] + "tags": [ + "scheduling", + "booking" + ] }, { "id": "grafana", @@ -142,7 +185,9 @@ "website": "https://grafana.com/", "docs": "https://grafana.com/docs/" }, - "tags": ["monitoring"] + "tags": [ + "monitoring" + ] }, { "id": "stalwart", @@ -176,7 +221,12 @@ "website": "https://datalens.tech/", "docs": "https://datalens.tech/docs/" }, - "tags": ["analytics", "self-hosted", "bi", "monitoring"] + "tags": [ + "analytics", + "self-hosted", + "bi", + "monitoring" + ] }, { "id": "directus", @@ -189,7 +239,9 @@ "website": "https://directus.io/", "docs": "https://docs.directus.io/" }, - "tags": ["cms"] + "tags": [ + "cms" + ] }, { "id": "baserow", @@ -202,7 +254,9 @@ "website": "https://baserow.io/", "docs": "https://baserow.io/docs/index" }, - "tags": ["database"] + "tags": [ + "database" + ] }, { "id": "budibase", @@ -215,7 +269,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", @@ -228,7 +287,10 @@ "website": "https://forgejo.org/", "docs": "https://forgejo.org/docs/latest/" }, - "tags": ["self-hosted", "storage"] + "tags": [ + "self-hosted", + "storage" + ] }, { "id": "ghost", @@ -241,7 +303,9 @@ "website": "https://ghost.org/", "docs": "https://ghost.org/docs/" }, - "tags": ["cms"] + "tags": [ + "cms" + ] }, { "id": "lodestone", @@ -254,7 +318,11 @@ "website": "https://lodestone.cc", "docs": "https://github.com/Lodestone-Team/lodestone/wiki" }, - "tags": ["minecraft", "hosting", "server"] + "tags": [ + "minecraft", + "hosting", + "server" + ] }, { "id": "dragonfly-db", @@ -267,7 +335,10 @@ "website": "https://www.dragonflydb.io/", "docs": "https://www.dragonflydb.io/docs" }, - "tags": ["database", "redis"] + "tags": [ + "database", + "redis" + ] }, { "id": "stack-auth", @@ -280,7 +351,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", @@ -293,7 +368,9 @@ "website": "https://uptime.kuma.pet/", "docs": "https://github.com/louislam/uptime-kuma/wiki" }, - "tags": ["monitoring"] + "tags": [ + "monitoring" + ] }, { "id": "n8n", @@ -306,7 +383,9 @@ "website": "https://n8n.io/", "docs": "https://docs.n8n.io/" }, - "tags": ["automation"] + "tags": [ + "automation" + ] }, { "id": "kestra", @@ -319,7 +398,9 @@ "website": "https://kestra.io", "docs": "https://kestra.io/docs" }, - "tags": ["automation"] + "tags": [ + "automation" + ] }, { "id": "wordpress", @@ -332,7 +413,9 @@ "website": "https://wordpress.org/", "docs": "https://wordpress.org/documentation/" }, - "tags": ["cms"] + "tags": [ + "cms" + ] }, { "id": "odoo", @@ -345,7 +428,9 @@ "website": "https://odoo.com/", "docs": "https://www.odoo.com/documentation/" }, - "tags": ["cms"] + "tags": [ + "cms" + ] }, { "id": "appsmith", @@ -358,7 +443,9 @@ "website": "https://appsmith.com/", "docs": "https://docs.appsmith.com/" }, - "tags": ["cms"] + "tags": [ + "cms" + ] }, { "id": "excalidraw", @@ -371,7 +458,9 @@ "website": "https://excalidraw.com/", "docs": "https://docs.excalidraw.com/" }, - "tags": ["drawing"] + "tags": [ + "drawing" + ] }, { "id": "documenso", @@ -384,7 +473,9 @@ "docs": "https://documenso.com/docs" }, "logo": "documenso.png", - "tags": ["document-signing"] + "tags": [ + "document-signing" + ] }, { "id": "nocodb", @@ -397,7 +488,12 @@ "docs": "https://docs.nocodb.com/" }, "logo": "nocodb.png", - "tags": ["database", "spreadsheet", "low-code", "nocode"] + "tags": [ + "database", + "spreadsheet", + "low-code", + "nocode" + ] }, { "id": "meilisearch", @@ -410,7 +506,9 @@ "website": "https://www.meilisearch.com/", "docs": "https://docs.meilisearch.com/" }, - "tags": ["search"] + "tags": [ + "search" + ] }, { "id": "mattermost", @@ -423,7 +521,10 @@ "website": "https://mattermost.com/", "docs": "https://docs.mattermost.com/" }, - "tags": ["chat", "self-hosted"] + "tags": [ + "chat", + "self-hosted" + ] }, { "id": "phpmyadmin", @@ -436,7 +537,9 @@ "website": "https://www.phpmyadmin.net/", "docs": "https://www.phpmyadmin.net/docs/" }, - "tags": ["database"] + "tags": [ + "database" + ] }, { "id": "rocketchat", @@ -449,7 +552,9 @@ "website": "https://rocket.chat/", "docs": "https://rocket.chat/docs/" }, - "tags": ["chat"] + "tags": [ + "chat" + ] }, { "id": "minio", @@ -462,7 +567,9 @@ "website": "https://minio.io/", "docs": "https://docs.minio.io/" }, - "tags": ["storage"] + "tags": [ + "storage" + ] }, { "id": "metabase", @@ -475,7 +582,10 @@ "website": "https://www.metabase.com/", "docs": "https://www.metabase.com/docs/" }, - "tags": ["database", "dashboard"] + "tags": [ + "database", + "dashboard" + ] }, { "id": "glitchtip", @@ -488,7 +598,9 @@ "website": "https://glitchtip.com/", "docs": "https://glitchtip.com/documentation" }, - "tags": ["hosting"] + "tags": [ + "hosting" + ] }, { "id": "open-webui", @@ -501,7 +613,9 @@ "website": "https://openwebui.com/", "docs": "https://docs.openwebui.com/" }, - "tags": ["chat"] + "tags": [ + "chat" + ] }, { "id": "mailpit", @@ -514,7 +628,10 @@ "website": "https://mailpit.axllent.org/", "docs": "https://mailpit.axllent.org/docs/" }, - "tags": ["email", "smtp"] + "tags": [ + "email", + "smtp" + ] }, { "id": "listmonk", @@ -527,7 +644,11 @@ "website": "https://listmonk.app/", "docs": "https://listmonk.app/docs/" }, - "tags": ["email", "newsletter", "mailing-list"] + "tags": [ + "email", + "newsletter", + "mailing-list" + ] }, { "id": "doublezero", @@ -540,7 +661,9 @@ "website": "https://www.double-zero.cloud/", "docs": "https://github.com/technomancy-dev/00" }, - "tags": ["email"] + "tags": [ + "email" + ] }, { "id": "umami", @@ -553,7 +676,9 @@ "website": "https://umami.is", "docs": "https://umami.is/docs" }, - "tags": ["analytics"] + "tags": [ + "analytics" + ] }, { "id": "jellyfin", @@ -566,7 +691,9 @@ "website": "https://jellyfin.org/", "docs": "https://jellyfin.org/docs/" }, - "tags": ["media system"] + "tags": [ + "media system" + ] }, { "id": "teable", @@ -579,7 +706,12 @@ "website": "https://teable.io/", "docs": "https://help.teable.io/" }, - "tags": ["database", "spreadsheet", "low-code", "nocode"] + "tags": [ + "database", + "spreadsheet", + "low-code", + "nocode" + ] }, { "id": "zipline", @@ -592,7 +724,10 @@ "website": "https://zipline.diced.sh/", "docs": "https://zipline.diced.sh/docs/" }, - "tags": ["media system", "storage"] + "tags": [ + "media system", + "storage" + ] }, { "id": "soketi", @@ -605,7 +740,9 @@ "website": "https://soketi.app/", "docs": "https://docs.soketi.app/" }, - "tags": ["chat"] + "tags": [ + "chat" + ] }, { "id": "aptabase", @@ -618,7 +755,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", @@ -631,7 +771,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", @@ -644,7 +788,11 @@ "website": "https://typecho.org/", "docs": "http://docs.typecho.org" }, - "tags": ["blog", "cms", "php"] + "tags": [ + "blog", + "cms", + "php" + ] }, { "id": "gitea", @@ -657,7 +805,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", @@ -670,7 +821,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", @@ -683,7 +841,11 @@ "website": "https://roundcube.net/", "docs": "https://roundcube.net/about/" }, - "tags": ["self-hosted", "email", "webmail"] + "tags": [ + "self-hosted", + "email", + "webmail" + ] }, { "id": "filebrowser", @@ -696,7 +858,10 @@ "website": "https://filebrowser.org/", "docs": "https://filebrowser.org/" }, - "tags": ["file-manager", "storage"] + "tags": [ + "file-manager", + "storage" + ] }, { "id": "focalboard", @@ -709,7 +874,9 @@ "website": "https://focalboard.com", "docs": "https://www.focalboard.com/docs/" }, - "tags": ["kanban"] + "tags": [ + "kanban" + ] }, { "id": "tolgee", @@ -722,7 +889,12 @@ "website": "https://tolgee.io", "docs": "https://tolgee.io/platform" }, - "tags": ["self-hosted", "i18n", "localization", "translations"] + "tags": [ + "self-hosted", + "i18n", + "localization", + "translations" + ] }, { "id": "portainer", @@ -735,7 +907,10 @@ "website": "https://www.portainer.io/", "docs": "https://docs.portainer.io/" }, - "tags": ["cloud", "monitoring"] + "tags": [ + "cloud", + "monitoring" + ] }, { "id": "plane", @@ -748,7 +923,9 @@ "website": "https://plane.so", "docs": "https://docs.plane.so/" }, - "tags": ["kanban"] + "tags": [ + "kanban" + ] }, { "id": "pterodactyl", @@ -761,7 +938,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", @@ -774,7 +955,11 @@ "website": "https://pyrodactyl.dev", "docs": "https://pyrodactyl.dev/docs" }, - "tags": ["self-hosted", "open-source", "management"] + "tags": [ + "self-hosted", + "open-source", + "management" + ] }, { "id": "influxdb", @@ -787,7 +972,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", @@ -800,7 +990,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", @@ -813,7 +1006,11 @@ "website": "https://docmost.com/", "docs": "https://docmost.com/docs/" }, - "tags": ["self-hosted", "open-source", "manager"] + "tags": [ + "self-hosted", + "open-source", + "manager" + ] }, { "id": "vaultwarden", @@ -826,7 +1023,9 @@ "website": "", "docs": "https://github.com/dani-garcia/vaultwarden/wiki" }, - "tags": ["open-source"] + "tags": [ + "open-source" + ] }, { "id": "linkwarden", @@ -839,7 +1038,10 @@ "website": "https://linkwarden.app/", "docs": "https://docs.linkwarden.app/" }, - "tags": ["bookmarks", "link-sharing"] + "tags": [ + "bookmarks", + "link-sharing" + ] }, { "id": "hi-events", @@ -852,7 +1054,11 @@ "website": "https://hi.events/", "docs": "https://hi.events/docs" }, - "tags": ["self-hosted", "open-source", "manager"] + "tags": [ + "self-hosted", + "open-source", + "manager" + ] }, { "id": "hoarder", @@ -865,7 +1071,11 @@ "website": "https://hoarder.app/", "docs": "https://docs.hoarder.app/" }, - "tags": ["self-hosted", "bookmarks", "link-sharing"] + "tags": [ + "self-hosted", + "bookmarks", + "link-sharing" + ] }, { "id": "windows", @@ -878,7 +1088,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", @@ -891,7 +1105,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", @@ -904,7 +1122,11 @@ "website": "https://coder.com/", "docs": "https://coder.com/docs" }, - "tags": ["self-hosted", "open-source", "builder"] + "tags": [ + "self-hosted", + "open-source", + "builder" + ] }, { "id": "stirling", @@ -917,7 +1139,10 @@ "website": "https://www.stirlingpdf.com/", "docs": "https://docs.stirlingpdf.com/" }, - "tags": ["pdf", "tools"] + "tags": [ + "pdf", + "tools" + ] }, { "id": "lobe-chat", @@ -930,7 +1155,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", @@ -943,7 +1171,11 @@ "website": "https://peppermint.sh/", "docs": "https://docs.peppermint.sh/" }, - "tags": ["api", "development", "documentation"] + "tags": [ + "api", + "development", + "documentation" + ] }, { "id": "windmill", @@ -956,7 +1188,11 @@ "website": "https://www.windmill.dev/", "docs": "https://docs.windmill.dev/" }, - "tags": ["workflow", "automation", "development"] + "tags": [ + "workflow", + "automation", + "development" + ] }, { "id": "activepieces", @@ -969,7 +1205,11 @@ "website": "https://www.activepieces.com/", "docs": "https://www.activepieces.com/docs" }, - "tags": ["automation", "workflow", "no-code"] + "tags": [ + "automation", + "workflow", + "no-code" + ] }, { "id": "invoiceshelf", @@ -982,7 +1222,11 @@ "website": "https://invoiceshelf.com", "docs": "https://github.com/InvoiceShelf/invoiceshelf#readme" }, - "tags": ["invoice", "business", "finance"] + "tags": [ + "invoice", + "business", + "finance" + ] }, { "id": "postiz", @@ -995,7 +1239,11 @@ "website": "https://postiz.com", "docs": "https://docs.postiz.com" }, - "tags": ["cms", "content-management", "publishing"] + "tags": [ + "cms", + "content-management", + "publishing" + ] }, { "id": "slash", @@ -1008,7 +1256,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", @@ -1021,7 +1273,11 @@ "website": "https://discordtickets.app", "docs": "https://discordtickets.app/self-hosting/installation/docker/" }, - "tags": ["discord", "tickets", "support"] + "tags": [ + "discord", + "tickets", + "support" + ] }, { "id": "nextcloud-aio", @@ -1034,7 +1290,10 @@ "website": "https://nextcloud.com/", "docs": "https://docs.nextcloud.com/" }, - "tags": ["file-manager", "sync"] + "tags": [ + "file-manager", + "sync" + ] }, { "id": "blender", @@ -1047,7 +1306,11 @@ "website": "https://www.blender.org/", "docs": "https://docs.blender.org/" }, - "tags": ["3d", "rendering", "animation"] + "tags": [ + "3d", + "rendering", + "animation" + ] }, { "id": "heyform", @@ -1060,7 +1323,13 @@ "website": "https://heyform.net", "docs": "https://docs.heyform.net" }, - "tags": ["form", "builder", "questionnaire", "quiz", "survey"] + "tags": [ + "form", + "builder", + "questionnaire", + "quiz", + "survey" + ] }, { "id": "chatwoot", @@ -1073,7 +1342,11 @@ "website": "https://www.chatwoot.com", "docs": "https://www.chatwoot.com/docs" }, - "tags": ["support", "chat", "customer-service"] + "tags": [ + "support", + "chat", + "customer-service" + ] }, { "id": "discourse", @@ -1086,7 +1359,11 @@ "website": "https://www.discourse.org/", "docs": "https://meta.discourse.org/" }, - "tags": ["forum", "community", "discussion"] + "tags": [ + "forum", + "community", + "discussion" + ] }, { "id": "immich", @@ -1099,7 +1376,12 @@ "website": "https://immich.app/", "docs": "https://immich.app/docs/overview/introduction" }, - "tags": ["photos", "videos", "backup", "media"] + "tags": [ + "photos", + "videos", + "backup", + "media" + ] }, { "id": "twenty", @@ -1112,7 +1394,11 @@ "website": "https://twenty.com", "docs": "https://docs.twenty.com" }, - "tags": ["crm", "sales", "business"] + "tags": [ + "crm", + "sales", + "business" + ] }, { "id": "yourls", @@ -1125,7 +1411,10 @@ "website": "https://yourls.org/", "docs": "https://yourls.org/#documentation" }, - "tags": ["url-shortener", "php"] + "tags": [ + "url-shortener", + "php" + ] }, { "id": "ryot", @@ -1138,7 +1427,11 @@ "website": "https://ryot.io/", "docs": "https://docs.ryot.io/" }, - "tags": ["media", "tracking", "self-hosted"] + "tags": [ + "media", + "tracking", + "self-hosted" + ] }, { "id": "photoprism", @@ -1151,7 +1444,11 @@ "website": "https://www.photoprism.app/", "docs": "https://docs.photoprism.app/" }, - "tags": ["media", "photos", "self-hosted"] + "tags": [ + "media", + "photos", + "self-hosted" + ] }, { "id": "ontime", @@ -1164,7 +1461,9 @@ "website": "https://getontime.no", "docs": "https://docs.getontime.no" }, - "tags": ["event"] + "tags": [ + "event" + ] }, { "id": "triggerdotdev", @@ -1177,7 +1476,10 @@ "website": "https://trigger.dev/", "docs": "https://trigger.dev/docs" }, - "tags": ["event-driven", "applications"] + "tags": [ + "event-driven", + "applications" + ] }, { "id": "browserless", @@ -1190,7 +1492,10 @@ "website": "https://www.browserless.io/", "docs": "https://docs.browserless.io/" }, - "tags": ["browser", "automation"] + "tags": [ + "browser", + "automation" + ] }, { "id": "drawio", @@ -1203,7 +1508,10 @@ "website": "https://draw.io/", "docs": "https://www.drawio.com/doc/" }, - "tags": ["drawing", "diagrams"] + "tags": [ + "drawing", + "diagrams" + ] }, { "id": "kimai", @@ -1216,7 +1524,11 @@ "website": "https://www.kimai.org", "docs": "https://www.kimai.org/documentation" }, - "tags": ["invoice", "business", "finance"] + "tags": [ + "invoice", + "business", + "finance" + ] }, { "id": "logto", @@ -1229,7 +1541,10 @@ "website": "https://logto.io/", "docs": "https://docs.logto.io/introduction" }, - "tags": ["identity", "auth"] + "tags": [ + "identity", + "auth" + ] }, { "id": "pocket-id", @@ -1242,7 +1557,10 @@ "website": "https://pocket-id.org/", "docs": "https://pocket-id.org/docs" }, - "tags": ["identity", "auth"] + "tags": [ + "identity", + "auth" + ] }, { "id": "penpot", @@ -1255,7 +1573,10 @@ "website": "https://penpot.app/", "docs": "https://docs.penpot.app/" }, - "tags": ["design", "collaboration"] + "tags": [ + "design", + "collaboration" + ] }, { "id": "huly", @@ -1268,7 +1589,11 @@ "website": "https://huly.io/", "docs": "https://docs.huly.io/" }, - "tags": ["project-management", "community", "discussion"] + "tags": [ + "project-management", + "community", + "discussion" + ] }, { "id": "unsend", @@ -1281,7 +1606,11 @@ "website": "https://unsend.dev/", "docs": "https://docs.unsend.dev/get-started/" }, - "tags": ["e-mail", "marketing", "business"] + "tags": [ + "e-mail", + "marketing", + "business" + ] }, { "id": "langflow", @@ -1294,7 +1623,9 @@ "website": "https://www.langflow.org/", "docs": "https://docs.langflow.org/" }, - "tags": ["ai"] + "tags": [ + "ai" + ] }, { "id": "elastic-search", @@ -1307,7 +1638,10 @@ "website": "https://www.elastic.co/elasticsearch/", "docs": "https://docs.elastic.co/elasticsearch/" }, - "tags": ["search", "analytics"] + "tags": [ + "search", + "analytics" + ] }, { "id": "onedev", @@ -1320,7 +1654,10 @@ "website": "https://onedev.io/", "docs": "https://docs.onedev.io/" }, - "tags": ["self-hosted", "development"] + "tags": [ + "self-hosted", + "development" + ] }, { "id": "unifi", @@ -1333,7 +1670,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", @@ -1346,7 +1686,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", @@ -1359,7 +1703,11 @@ "website": "https://bluewavelabs.ca", "docs": "https://bluewavelabs.gitbook.io/checkmate" }, - "tags": ["self-hosted", "monitoring", "uptime"] + "tags": [ + "self-hosted", + "monitoring", + "uptime" + ] }, { "id": "gotenberg", @@ -1372,7 +1720,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", @@ -1385,7 +1738,11 @@ "website": "https://actualbudget.org", "docs": "https://actualbudget.org/docs" }, - "tags": ["budgeting", "finance", "money"] + "tags": [ + "budgeting", + "finance", + "money" + ] }, { "id": "conduit", @@ -1398,7 +1755,10 @@ "website": "https://conduit.rs/", "docs": "https://docs.conduit.rs/" }, - "tags": ["matrix", "communication"] + "tags": [ + "matrix", + "communication" + ] }, { "id": "evolutionapi", @@ -1411,7 +1771,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", @@ -1424,7 +1788,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", @@ -1437,7 +1807,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", @@ -1450,7 +1825,10 @@ "website": "https://couchdb.apache.org/", "docs": "https://docs.couchdb.org/en/stable/" }, - "tags": ["database", "storage"] + "tags": [ + "database", + "storage" + ] }, { "id": "it-tools", @@ -1463,7 +1841,10 @@ "website": "https://it-tools.tech", "docs": "https://it-tools.tech/docs" }, - "tags": ["developer", "tools"] + "tags": [ + "developer", + "tools" + ] }, { "id": "superset", @@ -1476,7 +1857,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", @@ -1489,7 +1876,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", @@ -1502,7 +1894,10 @@ "docs": "https://homarr.dev/docs/getting-started/installation/docker", "website": "https://homarr.dev/" }, - "tags": ["dashboard", "monitoring"] + "tags": [ + "dashboard", + "monitoring" + ] }, { "id": "erpnext", @@ -1536,7 +1931,10 @@ "website": "https://maybe.finance/", "docs": "https://docs.maybe.finance/" }, - "tags": ["finance", "self-hosted"] + "tags": [ + "finance", + "self-hosted" + ] }, { "id": "spacedrive", @@ -1549,7 +1947,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", @@ -1562,7 +1964,11 @@ "docs": "https://distribution.github.io/distribution/" }, "logo": "registry.png", - "tags": ["registry", "docker", "self-hosted"] + "tags": [ + "registry", + "docker", + "self-hosted" + ] }, { "id": "alist", @@ -1575,7 +1981,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", @@ -1588,7 +1998,10 @@ "website": "https://answer.apache.org/", "docs": "https://answer.apache.org/docs" }, - "tags": ["q&a", "self-hosted"] + "tags": [ + "q&a", + "self-hosted" + ] }, { "id": "shlink", @@ -1601,7 +2014,11 @@ "website": "https://shlink.io", "docs": "https://shlink.io/documentation" }, - "tags": ["sharing", "shortener", "url"] + "tags": [ + "sharing", + "shortener", + "url" + ] }, { "id": "frappe-hr", @@ -1634,7 +2051,10 @@ "website": "https://formbricks.com/", "docs": "https://formbricks.com/docs" }, - "tags": ["forms", "analytics"] + "tags": [ + "forms", + "analytics" + ] }, { "id": "trilium", @@ -1647,7 +2067,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", @@ -1660,7 +2084,11 @@ "website": "https://www.convex.dev/", "docs": "https://www.convex.dev/docs" }, - "tags": ["backend", "database", "api"] + "tags": [ + "backend", + "database", + "api" + ] }, { "id": "wikijs", @@ -1673,7 +2101,11 @@ "website": "https://js.wiki/", "docs": "https://docs.requarks.io/" }, - "tags": ["knowledge-base", "self-hosted", "documentation"] + "tags": [ + "knowledge-base", + "self-hosted", + "documentation" + ] }, { "id": "otterwiki", @@ -1686,7 +2118,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", @@ -1699,7 +2136,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", @@ -1712,7 +2153,9 @@ "docs": "https://garethgeorge.github.io/backrest/introduction/getting-started" }, "logo": "backrest.svg", - "tags": ["backup"] + "tags": [ + "backup" + ] }, { "id": "blinko", @@ -1725,7 +2168,12 @@ "website": "https://blinko.space/", "docs": "https://docs.blinko.space/" }, - "tags": ["productivity", "organization", "workflow", "nextjs"] + "tags": [ + "productivity", + "organization", + "workflow", + "nextjs" + ] }, { "id": "pgadmin", @@ -1738,7 +2186,11 @@ "docs": "https://www.pgadmin.org/docs/" }, "logo": "pgadmin.webp", - "tags": ["database", "postgres", "admin"] + "tags": [ + "database", + "postgres", + "admin" + ] }, { "id": "ackee", @@ -1751,7 +2203,10 @@ "website": "https://ackee.electerious.com/", "docs": "https://docs.ackee.electerious.com/" }, - "tags": ["analytics", "self-hosted"] + "tags": [ + "analytics", + "self-hosted" + ] }, { "id": "adguardhome", @@ -1764,7 +2219,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", @@ -1777,7 +2237,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", @@ -1808,7 +2273,11 @@ "website": "https://github.com/Rudloff/alltube", "docs": "https://github.com/Rudloff/alltube/wiki" }, - "tags": ["media", "video", "downloader"] + "tags": [ + "media", + "video", + "downloader" + ] }, { "id": "ampache", @@ -1821,7 +2290,11 @@ "website": "http://ampache.org/", "docs": "https://github.com/ampache/ampache/wiki" }, - "tags": ["media", "music", "streaming"] + "tags": [ + "media", + "music", + "streaming" + ] }, { "id": "anythingllm", @@ -1834,7 +2307,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", @@ -1847,7 +2324,10 @@ "website": "https://github.com/caronc/apprise-api", "docs": "https://github.com/caronc/apprise-api/wiki" }, - "tags": ["notifications", "api"] + "tags": [ + "notifications", + "api" + ] }, { "id": "arangodb", @@ -1860,7 +2340,11 @@ "website": "https://www.arangodb.com/", "docs": "https://www.arangodb.com/docs/" }, - "tags": ["database", "graph-database", "nosql"] + "tags": [ + "database", + "graph-database", + "nosql" + ] }, { "id": "anonupload", @@ -1873,7 +2357,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", @@ -1886,7 +2373,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", @@ -1899,7 +2390,11 @@ "website": "https://www.audiobookshelf.org", "docs": "https://www.audiobookshelf.org/docs" }, - "tags": ["media", "audiobooks", "podcasts"] + "tags": [ + "media", + "audiobooks", + "podcasts" + ] }, { "id": "authorizer", @@ -1912,7 +2407,11 @@ "website": "https://authorizer.dev", "docs": "https://docs.authorizer.dev/" }, - "tags": ["authentication", "authorization", "security"] + "tags": [ + "authentication", + "authorization", + "security" + ] }, { "id": "automatisch", @@ -1925,7 +2424,11 @@ "website": "https://automatisch.io/docs", "docs": "https://automatisch.io/docs" }, - "tags": ["automation", "workflow", "integration"] + "tags": [ + "automation", + "workflow", + "integration" + ] }, { "id": "babybuddy", @@ -1938,7 +2441,11 @@ "website": "https://babybuddy.app", "docs": "https://docs.babybuddy.app" }, - "tags": ["parenting", "tracking", "family"] + "tags": [ + "parenting", + "tracking", + "family" + ] }, { "id": "baikal", @@ -1951,7 +2458,12 @@ "github": "https://sabre.io/baikal/", "docs": "https://sabre.io/baikal/install/" }, - "tags": ["calendar", "contacts", "caldav", "carddav"] + "tags": [ + "calendar", + "contacts", + "caldav", + "carddav" + ] }, { "id": "barrage", @@ -1964,7 +2476,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", @@ -1977,7 +2493,11 @@ "website": "https://www.bazarr.media/", "docs": "https://www.bazarr.media/docs" }, - "tags": ["subtitles", "sonarr", "radarr"] + "tags": [ + "subtitles", + "sonarr", + "radarr" + ] }, { "id": "beszel", @@ -1990,7 +2510,11 @@ "website": "https://beszel.dev", "docs": "https://beszel.dev/guide/getting-started" }, - "tags": ["monitoring", "docker", "alerts"] + "tags": [ + "monitoring", + "docker", + "alerts" + ] }, { "id": "bytestash", @@ -2003,7 +2527,10 @@ "website": "https://bytestash.com", "docs": "https://bytestash.com/docs" }, - "tags": ["file-storage", "self-hosted"] + "tags": [ + "file-storage", + "self-hosted" + ] }, { "id": "bookstack", @@ -2016,7 +2543,10 @@ "website": "https://www.bookstackapp.com", "docs": "https://www.bookstackapp.com/docs" }, - "tags": ["documentation", "self-hosted"] + "tags": [ + "documentation", + "self-hosted" + ] }, { "id": "bytebase", @@ -2029,7 +2559,10 @@ "website": "https://www.bytebase.com", "docs": "https://www.bytebase.com/docs" }, - "tags": ["database", "self-hosted"] + "tags": [ + "database", + "self-hosted" + ] }, { "id": "botpress", @@ -2042,7 +2575,10 @@ "website": "https://botpress.com", "docs": "https://botpress.com/docs" }, - "tags": ["ai", "self-hosted"] + "tags": [ + "ai", + "self-hosted" + ] }, { "id": "calibre", @@ -2055,7 +2591,10 @@ "website": "https://calibre-ebook.com/", "docs": "https://manual.calibre-ebook.com/" }, - "tags": ["Documents", "E-Commerce"] + "tags": [ + "Documents", + "E-Commerce" + ] }, { "id": "carbone", @@ -2068,7 +2607,35 @@ "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", + "name": "Casdoor", + "version": "latest", + "description": "An open-source UI-first Identity and Access Management (IAM) / Single-Sign-On (SSO) platform with web UI supporting OAuth 2.0, OIDC, SAML, CAS, LDAP, SCIM, WebAuthn, TOTP, MFA, and more.", + "logo": "casdoor.png", + "links": { + "github": "https://github.com/casdoor/casdoor", + "website": "https://casdoor.org/", + "docs": "https://casdoor.org/docs/overview" + }, + "tags": [ + "authentication", + "authorization", + "oauth2", + "oidc", + "sso", + "saml", + "identity-management", + "access-management", + "security" + ] }, { "id": "changedetection", @@ -2081,7 +2648,11 @@ "website": "https://changedetection.io", "docs": "https://github.com/dgtlmoon/changedetection.io/wiki" }, - "tags": ["Monitoring", "Data", "Notifications"] + "tags": [ + "Monitoring", + "Data", + "Notifications" + ] }, { "id": "chevereto", @@ -2132,7 +2703,11 @@ "website": "https://www.classicpress.net/", "docs": "https://docs.classicpress.net/" }, - "tags": ["cms", "wordpress", "content-management"] + "tags": [ + "cms", + "wordpress", + "content-management" + ] }, { "id": "cloud9", @@ -2145,7 +2720,11 @@ "website": "https://aws.amazon.com/cloud9/", "docs": "https://docs.aws.amazon.com/cloud9/" }, - "tags": ["ide", "development", "cloud"] + "tags": [ + "ide", + "development", + "cloud" + ] }, { "id": "cloudcommander", @@ -2158,7 +2737,11 @@ "website": "https://cloudcmd.io", "docs": "https://cloudcmd.io/#install" }, - "tags": ["file-manager", "web-based", "console"] + "tags": [ + "file-manager", + "web-based", + "console" + ] }, { "id": "cockpit", @@ -2171,7 +2754,11 @@ "website": "https://getcockpit.com", "docs": "https://getcockpit.com/documentation" }, - "tags": ["cms", "content-management", "api"] + "tags": [ + "cms", + "content-management", + "api" + ] }, { "id": "chromium", @@ -2184,7 +2771,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", @@ -2197,7 +2788,11 @@ "website": "https://codex.so", "docs": "https://docs.codex.so" }, - "tags": ["documentation", "development", "collaboration"] + "tags": [ + "documentation", + "development", + "collaboration" + ] }, { "id": "colanode", @@ -2210,7 +2805,11 @@ "website": "https://colanode.com", "docs": "https://colanode.com/docs/" }, - "tags": ["documentation", "knowledge-base", "collaboration"] + "tags": [ + "documentation", + "knowledge-base", + "collaboration" + ] }, { "id": "collabora-office", @@ -2223,7 +2822,11 @@ "website": "https://collaboraonline.com", "docs": "https://sdk.collaboraonline.com/docs" }, - "tags": ["office", "documents", "collaboration"] + "tags": [ + "office", + "documents", + "collaboration" + ] }, { "id": "confluence", @@ -2254,7 +2857,11 @@ "github": "https://github.com/souramoo/commentoplusplus" }, "logo": "logo.png", - "tags": ["comments", "discussion", "website"] + "tags": [ + "comments", + "discussion", + "website" + ] }, { "id": "commentoplusplus", @@ -2267,7 +2874,11 @@ "github": "https://github.com/souramoo/commentoplusplus" }, "logo": "logo.png", - "tags": ["comments", "website", "open-source"] + "tags": [ + "comments", + "website", + "open-source" + ] }, { "id": "coralproject", @@ -2280,7 +2891,11 @@ "github": "https://github.com/coralproject/talk" }, "logo": "logo.png", - "tags": ["communication", "community", "privacy"] + "tags": [ + "communication", + "community", + "privacy" + ] }, { "id": "rsshub", @@ -2293,7 +2908,11 @@ "website": "https://rsshub.app/", "docs": "https://docs.rsshub.app/" }, - "tags": ["rss", "api", "self-hosted"] + "tags": [ + "rss", + "api", + "self-hosted" + ] }, { "id": "tailscale-exitnode", @@ -2306,7 +2925,9 @@ "website": "https://tailscale.com/", "docs": "https://tailscale.com/kb/1408/quick-guide-exit-nodes" }, - "tags": ["network"] + "tags": [ + "network" + ] }, { "id": "homebridge", @@ -2319,7 +2940,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", @@ -2351,7 +2978,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", @@ -2364,7 +2995,12 @@ "website": "https://onetimesecret.com", "docs": "https://docs.onetimesecret.com" }, - "tags": ["auth", "password", "secret", "secure"] + "tags": [ + "auth", + "password", + "secret", + "secure" + ] }, { "id": "bugsink", @@ -2377,7 +3013,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", @@ -2390,7 +3030,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", @@ -2403,7 +3050,11 @@ "website": "https://qdrant.tech/", "docs": "https://qdrant.tech/documentation/" }, - "tags": ["vector-db", "database", "search"] + "tags": [ + "vector-db", + "database", + "search" + ] }, { "id": "trmnl-byos-laravel", @@ -2416,7 +3067,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", @@ -2429,7 +3082,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", @@ -2442,7 +3099,9 @@ "website": "https://rybbit.io", "docs": "https://www.rybbit.io/docs" }, - "tags": ["analytics"] + "tags": [ + "analytics" + ] }, { "id": "seafile", @@ -2455,7 +3114,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", @@ -2486,7 +3149,9 @@ "website": "https://www.docuseal.com/", "docs": "https://www.docuseal.com/" }, - "tags": ["document-signing"] + "tags": [ + "document-signing" + ] }, { "id": "kutt", @@ -2499,7 +3164,10 @@ "website": "https://kutt.it", "docs": "https://github.com/thedevs-network/kutt#kuttit" }, - "tags": ["link-shortener", "link-sharing"] + "tags": [ + "link-shortener", + "link-sharing" + ] }, { "id": "palmr", @@ -2512,7 +3180,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", @@ -2583,7 +3255,7 @@ "rating" ] }, - { + { "id": "go-whatsapp-web-multidevice", "name": "WhatsApp API Multi Device Version", "version": "latest", @@ -2618,4 +3290,4 @@ "rabbitmq" ] } -] +] \ No newline at end of file