diff --git a/blueprints/casdoor/casdoor.png b/blueprints/casdoor/casdoor.png new file mode 100644 index 00000000..2ee7e700 Binary files /dev/null and b/blueprints/casdoor/casdoor.png differ 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