diff --git a/blueprints/authelia/authelia.png b/blueprints/authelia/authelia.png new file mode 100644 index 00000000..8555e352 Binary files /dev/null and b/blueprints/authelia/authelia.png differ diff --git a/blueprints/authelia/docker-compose.yml b/blueprints/authelia/docker-compose.yml new file mode 100644 index 00000000..fa65571b --- /dev/null +++ b/blueprints/authelia/docker-compose.yml @@ -0,0 +1,55 @@ +services: + authelia: + image: authelia/authelia:latest + restart: unless-stopped + volumes: + - authelia_config:/config + - ../files/configuration.yml:/config/configuration.yml:ro + - ../files/users_database.yml:/config/users_database.yml + environment: + AUTHELIA_JWT_SECRET: $JWT_SECRET + AUTHELIA_SESSION_SECRET: $SESSION_SECRET + AUTHELIA_STORAGE_ENCRYPTION_KEY: $STORAGE_ENCRYPTION_KEY + AUTHELIA_STORAGE_POSTGRES_PASSWORD: $POSTGRES_PASSWORD + depends_on: + redis: + condition: service_healthy + postgres: + condition: service_healthy + ports: + - 9091 + + redis: + image: redis:7-alpine + restart: unless-stopped + volumes: + - redis_data:/data + command: redis-server --save 60 1 --loglevel warning --requirepass $REDIS_PASSWORD + environment: + REDIS_PASSWORD: $REDIS_PASSWORD + healthcheck: + test: ["CMD", "redis-cli", "--raw", "incr", "ping"] + interval: 10s + timeout: 3s + retries: 5 + + postgres: + image: postgres:16-alpine + restart: unless-stopped + volumes: + - postgres_data:/var/lib/postgresql/data + environment: + POSTGRES_DB: authelia + POSTGRES_USER: authelia + POSTGRES_PASSWORD: $POSTGRES_PASSWORD + healthcheck: + test: ["CMD-SHELL", "pg_isready -U authelia -d authelia"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s + +volumes: + authelia_config: + redis_data: + postgres_data: \ No newline at end of file diff --git a/blueprints/authelia/template.toml b/blueprints/authelia/template.toml new file mode 100644 index 00000000..9dfdd912 --- /dev/null +++ b/blueprints/authelia/template.toml @@ -0,0 +1,195 @@ +[variables] +main_domain = "${domain}" +jwt_secret = "${password:64}" +session_secret = "${password:64}" +storage_encryption_key = "${password:64}" +redis_password = "${password:32}" +postgres_password = "${password:32}" +admin_username = "${username}" +admin_email = "${email}" +admin_password = "AdminPass123!" +admin_password_hash = "$argon2id$v=19$m=65536,t=3,p=4$170PGJ1MskQyxfFknfBPFQ$VqD1/pqC3fBHo+Zk58bC2xQm1ltOFTr0w2wx93vJgC4" + +[config] +[[config.domains]] +serviceName = "authelia" +port = 9091 +host = "${main_domain}" +path = "/" + +[config.env] +JWT_SECRET = "${jwt_secret}" +SESSION_SECRET = "${session_secret}" +STORAGE_ENCRYPTION_KEY = "${storage_encryption_key}" +REDIS_PASSWORD = "${redis_password}" +POSTGRES_PASSWORD = "${postgres_password}" +admin_username = "${admin_username}" +admin_email = "${admin_email}" + +[[config.mounts]] +filePath = "configuration.yml" +content = """ +############################################################### +# Authelia configuration # +############################################################### + +# DEFAULT ADMIN CREDENTIALS: +# Username: (auto-generated, check users_database.yml) +# Password: AdminPass123! +# Email: (auto-generated) +# +# IMPORTANT: Change the password after first login! +# SECURITY NOTE: This template starts with one-factor auth for easier setup. +# After configuring SMTP/notifications, change the policy to 'two_factor' + +# Server Configuration +server: + address: 'tcp://0.0.0.0:9091' + headers: + csp_template: '' + +# Log Configuration +log: + level: info + format: text + +# Theme +theme: auto + +# TOTP Configuration +totp: + disable: false + issuer: authelia.com + algorithm: sha1 + digits: 6 + period: 30 + skew: 1 + secret_size: 32 + +# WebAuthn/FIDO2 Configuration +webauthn: + disable: false + timeout: 60s + display_name: Authelia + attestation_conveyance_preference: indirect + user_verification: preferred + +# NTP Configuration +ntp: + address: 'time.cloudflare.com:123' + version: 4 + max_desync: 3s + disable_startup_check: false + disable_failure: false + +# Authentication Backend Configuration +authentication_backend: + password_reset: + disable: false + custom_url: '' + refresh_interval: 5m + file: + path: /config/users_database.yml + watch: false + search: + email: false + case_insensitive: false + password: + algorithm: argon2 + argon2: + variant: argon2id + iterations: 3 + memory: 65536 + parallelism: 4 + key_length: 32 + salt_length: 16 + +# Password Policy +password_policy: + standard: + enabled: false + min_length: 8 + max_length: 0 + require_uppercase: true + require_lowercase: true + require_number: true + require_special: true + zxcvbn: + enabled: false + min_score: 3 + +# Session Configuration +session: + name: authelia_session + domain: ${main_domain} + same_site: lax + secret: ${session_secret} + expiration: 1h + inactivity: 5m + remember_me_duration: 1M + redis: + host: redis + port: 6379 + password: ${redis_password} + database_index: 0 + maximum_active_connections: 8 + minimum_idle_connections: 0 + +# Storage Configuration +storage: + encryption_key: ${storage_encryption_key} + postgres: + host: postgres + port: 5432 + database: authelia + schema: public + username: authelia + password: ${postgres_password} + timeout: 5s + +# Notifier Configuration +notifier: + disable_startup_check: true + filesystem: + filename: /config/notification.txt + +# Regulation Configuration +regulation: + max_retries: 3 + find_time: 10m + ban_time: 12h + +# Access Control Configuration - MODIFIED FOR EASIER INITIAL SETUP +access_control: + default_policy: deny + rules: + - domain: ${main_domain} + policy: one_factor # Changed from one_factor to two_factor for production +""" + +[[config.mounts]] +filePath = "users_database.yml" +content = """ +############################################################### +# Users Database # +############################################################### + +# DEFAULT LOGIN CREDENTIALS: +# Username: (generated from username helper) +# Password: AdminPass123! +# Email: (generated from email helper) +# +# IMPORTANT: Change the default password after first login! +# To generate a new password hash, run: +# docker run authelia/authelia:latest authelia hash-password 'your-new-password' + +users: + ${admin_username}: + disabled: false + displayname: "Authelia Admin" + password: "${admin_password_hash}" + email: ${admin_email} + groups: + - admins + - dev +""" diff --git a/meta.json b/meta.json index 85dd94ec..381edc6b 100644 --- a/meta.json +++ b/meta.json @@ -10,7 +10,34 @@ "docs": "https://autobase.tech/docs" }, "logo": "autobase.svg", - "tags": ["database", "postgres", "automation", "self-hosted", "dbaas"] + "tags": [ + "database", + "postgres", + "automation", + "self-hosted", + "dbaas" + ] + }, + { + "id": "authelia", + "name": "Authelia", + "version": "latest", + "description": "The Single Sign-On Multi-Factor portal for web apps. An open-source authentication and authorization server providing 2FA and SSO via web portal.", + "logo": "authelia.png", + "links": { + "github": "https://github.com/authelia/authelia", + "website": "https://www.authelia.com/", + "docs": "https://www.authelia.com/overview/prologue/introduction/" + }, + "tags": [ + "authentication", + "authorization", + "2fa", + "sso", + "security", + "reverse-proxy", + "ldap" + ] }, { "id": "capso", @@ -23,7 +50,13 @@ "docs": "https://cap.so/docs/" }, "logo": "capso.png", - "tags": ["web", "s3", "mysql", "development", "self-hosted"] + "tags": [ + "web", + "s3", + "mysql", + "development", + "self-hosted" + ] }, { "id": "authentik", @@ -57,7 +90,13 @@ "docs": "https://github.com/freescout-helpdesk/freescout/wiki/Installation-Guide" }, "logo": "freescout.svg", - "tags": ["helpdesk", "support", "email", "customer-service", "self-hosted"] + "tags": [ + "helpdesk", + "support", + "email", + "customer-service", + "self-hosted" + ] }, { "id": "openresty-manager", @@ -70,7 +109,14 @@ "docs": "https://github.com/Safe3/openresty-manager" }, "logo": "logo.svg", - "tags": ["web", "proxy", "security", "self-hosted", "openresty", "nginx"] + "tags": [ + "web", + "proxy", + "security", + "self-hosted", + "openresty", + "nginx" + ] }, { "id": "appwrite", @@ -83,7 +129,11 @@ "docs": "https://appwrite.io/docs" }, "logo": "appwrite.svg", - "tags": ["database", "firebase", "postgres"] + "tags": [ + "database", + "firebase", + "postgres" + ] }, { "id": "outline", @@ -96,7 +146,11 @@ "docs": "https://docs.getoutline.com/s/guide" }, "logo": "outline.png", - "tags": ["documentation", "knowledge-base", "self-hosted"] + "tags": [ + "documentation", + "knowledge-base", + "self-hosted" + ] }, { "id": "supabase", @@ -109,7 +163,11 @@ "docs": "https://supabase.com/docs/guides/self-hosting" }, "logo": "supabase.svg", - "tags": ["database", "firebase", "postgres"], + "tags": [ + "database", + "firebase", + "postgres" + ], "dokploy_version": ">=0.22.5" }, { @@ -123,7 +181,11 @@ "docs": "https://supabase.com/docs/guides/self-hosting" }, "logo": "supabase.svg", - "tags": ["database", "firebase", "postgres"], + "tags": [ + "database", + "firebase", + "postgres" + ], "dokploy_version": "<0.22.5" }, { @@ -137,7 +199,11 @@ "website": "https://pocketbase.io/", "docs": "https://pocketbase.io/docs/" }, - "tags": ["backend", "database", "api"] + "tags": [ + "backend", + "database", + "api" + ] }, { "id": "plausible", @@ -150,7 +216,9 @@ "website": "https://plausible.io/", "docs": "https://plausible.io/docs" }, - "tags": ["analytics"] + "tags": [ + "analytics" + ] }, { "id": "calcom", @@ -163,7 +231,10 @@ "docs": "https://cal.com/docs" }, "logo": "calcom.jpg", - "tags": ["scheduling", "booking"] + "tags": [ + "scheduling", + "booking" + ] }, { "id": "grafana", @@ -176,7 +247,9 @@ "website": "https://grafana.com/", "docs": "https://grafana.com/docs/" }, - "tags": ["monitoring"] + "tags": [ + "monitoring" + ] }, { "id": "stalwart", @@ -210,7 +283,12 @@ "website": "https://datalens.tech/", "docs": "https://datalens.tech/docs/" }, - "tags": ["analytics", "self-hosted", "bi", "monitoring"] + "tags": [ + "analytics", + "self-hosted", + "bi", + "monitoring" + ] }, { "id": "directus", @@ -223,7 +301,9 @@ "website": "https://directus.io/", "docs": "https://docs.directus.io/" }, - "tags": ["cms"] + "tags": [ + "cms" + ] }, { "id": "baserow", @@ -236,7 +316,9 @@ "website": "https://baserow.io/", "docs": "https://baserow.io/docs/index" }, - "tags": ["database"] + "tags": [ + "database" + ] }, { "id": "budibase", @@ -249,7 +331,12 @@ "website": "https://budibase.com/", "docs": "https://docs.budibase.com/docs/" }, - "tags": ["database", "low-code", "nocode", "applications"] + "tags": [ + "database", + "low-code", + "nocode", + "applications" + ] }, { "id": "forgejo", @@ -262,7 +349,10 @@ "website": "https://forgejo.org/", "docs": "https://forgejo.org/docs/latest/" }, - "tags": ["self-hosted", "storage"] + "tags": [ + "self-hosted", + "storage" + ] }, { "id": "gitlab-ce", @@ -275,7 +365,12 @@ "website": "https://gitlab.com/", "docs": "https://docs.gitlab.com/ee/" }, - "tags": ["git", "ci-cd", "version-control", "project-management"] + "tags": [ + "git", + "ci-cd", + "version-control", + "project-management" + ] }, { "id": "ghost", @@ -288,7 +383,9 @@ "website": "https://ghost.org/", "docs": "https://ghost.org/docs/" }, - "tags": ["cms"] + "tags": [ + "cms" + ] }, { "id": "lodestone", @@ -301,7 +398,11 @@ "website": "https://lodestone.cc", "docs": "https://github.com/Lodestone-Team/lodestone/wiki" }, - "tags": ["minecraft", "hosting", "server"] + "tags": [ + "minecraft", + "hosting", + "server" + ] }, { "id": "dragonfly-db", @@ -314,7 +415,10 @@ "website": "https://www.dragonflydb.io/", "docs": "https://www.dragonflydb.io/docs" }, - "tags": ["database", "redis"] + "tags": [ + "database", + "redis" + ] }, { "id": "stack-auth", @@ -327,7 +431,11 @@ "website": "https://stack-auth.com/", "docs": "https://docs.stack-auth.com/next/overview" }, - "tags": ["authentication", "auth", "authorization"] + "tags": [ + "authentication", + "auth", + "authorization" + ] }, { "id": "uptime-kuma", @@ -340,7 +448,9 @@ "website": "https://uptime.kuma.pet/", "docs": "https://github.com/louislam/uptime-kuma/wiki" }, - "tags": ["monitoring"] + "tags": [ + "monitoring" + ] }, { "id": "n8n", @@ -353,7 +463,9 @@ "website": "https://n8n.io/", "docs": "https://docs.n8n.io/" }, - "tags": ["automation"] + "tags": [ + "automation" + ] }, { "id": "kestra", @@ -366,7 +478,9 @@ "website": "https://kestra.io", "docs": "https://kestra.io/docs" }, - "tags": ["automation"] + "tags": [ + "automation" + ] }, { "id": "wordpress", @@ -379,7 +493,9 @@ "website": "https://wordpress.org/", "docs": "https://wordpress.org/documentation/" }, - "tags": ["cms"] + "tags": [ + "cms" + ] }, { "id": "odoo", @@ -392,7 +508,9 @@ "website": "https://odoo.com/", "docs": "https://www.odoo.com/documentation/" }, - "tags": ["cms"] + "tags": [ + "cms" + ] }, { "id": "appsmith", @@ -405,7 +523,9 @@ "website": "https://appsmith.com/", "docs": "https://docs.appsmith.com/" }, - "tags": ["cms"] + "tags": [ + "cms" + ] }, { "id": "excalidraw", @@ -418,7 +538,9 @@ "website": "https://excalidraw.com/", "docs": "https://docs.excalidraw.com/" }, - "tags": ["drawing"] + "tags": [ + "drawing" + ] }, { "id": "documenso", @@ -431,7 +553,9 @@ "docs": "https://documenso.com/docs" }, "logo": "documenso.png", - "tags": ["document-signing"] + "tags": [ + "document-signing" + ] }, { "id": "nocodb", @@ -444,7 +568,12 @@ "docs": "https://docs.nocodb.com/" }, "logo": "nocodb.png", - "tags": ["database", "spreadsheet", "low-code", "nocode"] + "tags": [ + "database", + "spreadsheet", + "low-code", + "nocode" + ] }, { "id": "meilisearch", @@ -457,7 +586,9 @@ "website": "https://www.meilisearch.com/", "docs": "https://docs.meilisearch.com/" }, - "tags": ["search"] + "tags": [ + "search" + ] }, { "id": "mattermost", @@ -470,7 +601,10 @@ "website": "https://mattermost.com/", "docs": "https://docs.mattermost.com/" }, - "tags": ["chat", "self-hosted"] + "tags": [ + "chat", + "self-hosted" + ] }, { "id": "phpmyadmin", @@ -483,7 +617,9 @@ "website": "https://www.phpmyadmin.net/", "docs": "https://www.phpmyadmin.net/docs/" }, - "tags": ["database"] + "tags": [ + "database" + ] }, { "id": "rocketchat", @@ -496,7 +632,9 @@ "website": "https://rocket.chat/", "docs": "https://rocket.chat/docs/" }, - "tags": ["chat"] + "tags": [ + "chat" + ] }, { "id": "minio", @@ -509,7 +647,9 @@ "website": "https://minio.io/", "docs": "https://docs.minio.io/" }, - "tags": ["storage"] + "tags": [ + "storage" + ] }, { "id": "metabase", @@ -522,7 +662,10 @@ "website": "https://www.metabase.com/", "docs": "https://www.metabase.com/docs/" }, - "tags": ["database", "dashboard"] + "tags": [ + "database", + "dashboard" + ] }, { "id": "glitchtip", @@ -535,7 +678,9 @@ "website": "https://glitchtip.com/", "docs": "https://glitchtip.com/documentation" }, - "tags": ["hosting"] + "tags": [ + "hosting" + ] }, { "id": "open-webui", @@ -548,7 +693,9 @@ "website": "https://openwebui.com/", "docs": "https://docs.openwebui.com/" }, - "tags": ["chat"] + "tags": [ + "chat" + ] }, { "id": "mailpit", @@ -561,7 +708,10 @@ "website": "https://mailpit.axllent.org/", "docs": "https://mailpit.axllent.org/docs/" }, - "tags": ["email", "smtp"] + "tags": [ + "email", + "smtp" + ] }, { "id": "listmonk", @@ -574,7 +724,11 @@ "website": "https://listmonk.app/", "docs": "https://listmonk.app/docs/" }, - "tags": ["email", "newsletter", "mailing-list"] + "tags": [ + "email", + "newsletter", + "mailing-list" + ] }, { "id": "doublezero", @@ -587,7 +741,9 @@ "website": "https://www.double-zero.cloud/", "docs": "https://github.com/technomancy-dev/00" }, - "tags": ["email"] + "tags": [ + "email" + ] }, { "id": "umami", @@ -600,7 +756,9 @@ "website": "https://umami.is", "docs": "https://umami.is/docs" }, - "tags": ["analytics"] + "tags": [ + "analytics" + ] }, { "id": "jellyfin", @@ -613,7 +771,9 @@ "website": "https://jellyfin.org/", "docs": "https://jellyfin.org/docs/" }, - "tags": ["media system"] + "tags": [ + "media system" + ] }, { "id": "teable", @@ -626,7 +786,12 @@ "website": "https://teable.io/", "docs": "https://help.teable.io/" }, - "tags": ["database", "spreadsheet", "low-code", "nocode"] + "tags": [ + "database", + "spreadsheet", + "low-code", + "nocode" + ] }, { "id": "zipline", @@ -639,7 +804,10 @@ "website": "https://zipline.diced.sh/", "docs": "https://zipline.diced.sh/docs/" }, - "tags": ["media system", "storage"] + "tags": [ + "media system", + "storage" + ] }, { "id": "soketi", @@ -652,7 +820,9 @@ "website": "https://soketi.app/", "docs": "https://docs.soketi.app/" }, - "tags": ["chat"] + "tags": [ + "chat" + ] }, { "id": "aptabase", @@ -665,7 +835,10 @@ "website": "https://aptabase.com/", "docs": "https://github.com/aptabase/aptabase/blob/main/README.md" }, - "tags": ["analytics", "self-hosted"] + "tags": [ + "analytics", + "self-hosted" + ] }, { "id": "typebot", @@ -678,7 +851,11 @@ "website": "https://typebot.io/", "docs": "https://docs.typebot.io/get-started/introduction" }, - "tags": ["chatbot", "builder", "open-source"] + "tags": [ + "chatbot", + "builder", + "open-source" + ] }, { "id": "typecho", @@ -691,7 +868,11 @@ "website": "https://typecho.org/", "docs": "http://docs.typecho.org" }, - "tags": ["blog", "cms", "php"] + "tags": [ + "blog", + "cms", + "php" + ] }, { "id": "gitea", @@ -704,7 +885,10 @@ "website": "https://gitea.com/", "docs": "https://docs.gitea.com/installation/install-with-docker" }, - "tags": ["self-hosted", "storage"] + "tags": [ + "self-hosted", + "storage" + ] }, { "id": "gitea-mirror", @@ -717,7 +901,14 @@ "website": "https://github.com/arunavo4/gitea-mirror", "docs": "https://github.com/arunavo4/gitea-mirror#readme" }, - "tags": ["git", "mirror", "github", "gitea", "self-hosted", "automation"] + "tags": [ + "git", + "mirror", + "github", + "gitea", + "self-hosted", + "automation" + ] }, { "id": "roundcube", @@ -730,7 +921,11 @@ "website": "https://roundcube.net/", "docs": "https://roundcube.net/about/" }, - "tags": ["self-hosted", "email", "webmail"] + "tags": [ + "self-hosted", + "email", + "webmail" + ] }, { "id": "filebrowser", @@ -743,7 +938,10 @@ "website": "https://filebrowser.org/", "docs": "https://filebrowser.org/" }, - "tags": ["file-manager", "storage"] + "tags": [ + "file-manager", + "storage" + ] }, { "id": "focalboard", @@ -756,7 +954,9 @@ "website": "https://focalboard.com", "docs": "https://www.focalboard.com/docs/" }, - "tags": ["kanban"] + "tags": [ + "kanban" + ] }, { "id": "tolgee", @@ -769,7 +969,12 @@ "website": "https://tolgee.io", "docs": "https://tolgee.io/platform" }, - "tags": ["self-hosted", "i18n", "localization", "translations"] + "tags": [ + "self-hosted", + "i18n", + "localization", + "translations" + ] }, { "id": "portainer", @@ -782,7 +987,10 @@ "website": "https://www.portainer.io/", "docs": "https://docs.portainer.io/" }, - "tags": ["cloud", "monitoring"] + "tags": [ + "cloud", + "monitoring" + ] }, { "id": "plane", @@ -795,7 +1003,9 @@ "website": "https://plane.so", "docs": "https://docs.plane.so/" }, - "tags": ["kanban"] + "tags": [ + "kanban" + ] }, { "id": "pterodactyl", @@ -808,7 +1018,11 @@ "website": "https://pterodactyl.io", "docs": "https://pterodactyl.io/project/introduction.html" }, - "tags": ["self-hosted", "open-source", "management"] + "tags": [ + "self-hosted", + "open-source", + "management" + ] }, { "id": "pyrodactyl", @@ -821,7 +1035,11 @@ "website": "https://pyrodactyl.dev", "docs": "https://pyrodactyl.dev/docs" }, - "tags": ["self-hosted", "open-source", "management"] + "tags": [ + "self-hosted", + "open-source", + "management" + ] }, { "id": "influxdb", @@ -834,7 +1052,12 @@ "website": "https://www.influxdata.com/", "docs": "https://docs.influxdata.com/influxdb/v2/" }, - "tags": ["self-hosted", "open-source", "storage", "database"] + "tags": [ + "self-hosted", + "open-source", + "storage", + "database" + ] }, { "id": "infisical", @@ -847,7 +1070,10 @@ "website": "https://infisical.com/", "docs": "https://infisical.com/docs/documentation/getting-started/introduction" }, - "tags": ["self-hosted", "open-source"] + "tags": [ + "self-hosted", + "open-source" + ] }, { "id": "docmost", @@ -860,7 +1086,11 @@ "website": "https://docmost.com/", "docs": "https://docmost.com/docs/" }, - "tags": ["self-hosted", "open-source", "manager"] + "tags": [ + "self-hosted", + "open-source", + "manager" + ] }, { "id": "vaultwarden", @@ -873,7 +1103,9 @@ "website": "", "docs": "https://github.com/dani-garcia/vaultwarden/wiki" }, - "tags": ["open-source"] + "tags": [ + "open-source" + ] }, { "id": "linkding", @@ -886,7 +1118,10 @@ "website": "https://sissbruecker.github.io/linkding/", "docs": "https://github.com/sissbruecker/linkding/blob/master/docs/Options.md" }, - "tags": ["bookmark-manager", "self-hosted"] + "tags": [ + "bookmark-manager", + "self-hosted" + ] }, { "id": "linkwarden", @@ -899,7 +1134,10 @@ "website": "https://linkwarden.app/", "docs": "https://docs.linkwarden.app/" }, - "tags": ["bookmarks", "link-sharing"] + "tags": [ + "bookmarks", + "link-sharing" + ] }, { "id": "hi-events", @@ -912,7 +1150,11 @@ "website": "https://hi.events/", "docs": "https://hi.events/docs" }, - "tags": ["self-hosted", "open-source", "manager"] + "tags": [ + "self-hosted", + "open-source", + "manager" + ] }, { "id": "habitica", @@ -925,7 +1167,12 @@ "website": "https://habitica.com/", "docs": "https://habitica.fandom.com/wiki/Setting_up_Habitica_Locally" }, - "tags": ["productivity", "gamification", "habits", "self-hosted"] + "tags": [ + "productivity", + "gamification", + "habits", + "self-hosted" + ] }, { "id": "hoarder", @@ -938,7 +1185,11 @@ "website": "https://hoarder.app/", "docs": "https://docs.hoarder.app/" }, - "tags": ["self-hosted", "bookmarks", "link-sharing"] + "tags": [ + "self-hosted", + "bookmarks", + "link-sharing" + ] }, { "id": "windows", @@ -951,7 +1202,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", @@ -964,7 +1219,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", @@ -977,7 +1236,11 @@ "website": "https://coder.com/", "docs": "https://coder.com/docs" }, - "tags": ["self-hosted", "open-source", "builder"] + "tags": [ + "self-hosted", + "open-source", + "builder" + ] }, { "id": "stirling", @@ -990,7 +1253,10 @@ "website": "https://www.stirlingpdf.com/", "docs": "https://docs.stirlingpdf.com/" }, - "tags": ["pdf", "tools"] + "tags": [ + "pdf", + "tools" + ] }, { "id": "lobe-chat", @@ -1003,7 +1269,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", @@ -1016,7 +1285,11 @@ "website": "https://peppermint.sh/", "docs": "https://docs.peppermint.sh/" }, - "tags": ["api", "development", "documentation"] + "tags": [ + "api", + "development", + "documentation" + ] }, { "id": "windmill", @@ -1029,7 +1302,11 @@ "website": "https://www.windmill.dev/", "docs": "https://docs.windmill.dev/" }, - "tags": ["workflow", "automation", "development"] + "tags": [ + "workflow", + "automation", + "development" + ] }, { "id": "activepieces", @@ -1042,7 +1319,11 @@ "website": "https://www.activepieces.com/", "docs": "https://www.activepieces.com/docs" }, - "tags": ["automation", "workflow", "no-code"] + "tags": [ + "automation", + "workflow", + "no-code" + ] }, { "id": "invoiceshelf", @@ -1055,7 +1336,11 @@ "website": "https://invoiceshelf.com", "docs": "https://github.com/InvoiceShelf/invoiceshelf#readme" }, - "tags": ["invoice", "business", "finance"] + "tags": [ + "invoice", + "business", + "finance" + ] }, { "id": "postiz", @@ -1068,7 +1353,11 @@ "website": "https://postiz.com", "docs": "https://docs.postiz.com" }, - "tags": ["cms", "content-management", "publishing"] + "tags": [ + "cms", + "content-management", + "publishing" + ] }, { "id": "slash", @@ -1081,7 +1370,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", @@ -1094,7 +1387,11 @@ "website": "https://discordtickets.app", "docs": "https://discordtickets.app/self-hosting/installation/docker/" }, - "tags": ["discord", "tickets", "support"] + "tags": [ + "discord", + "tickets", + "support" + ] }, { "id": "nextcloud-aio", @@ -1107,7 +1404,10 @@ "website": "https://nextcloud.com/", "docs": "https://docs.nextcloud.com/" }, - "tags": ["file-manager", "sync"] + "tags": [ + "file-manager", + "sync" + ] }, { "id": "blender", @@ -1120,7 +1420,11 @@ "website": "https://www.blender.org/", "docs": "https://docs.blender.org/" }, - "tags": ["3d", "rendering", "animation"] + "tags": [ + "3d", + "rendering", + "animation" + ] }, { "id": "heyform", @@ -1133,7 +1437,13 @@ "website": "https://heyform.net", "docs": "https://docs.heyform.net" }, - "tags": ["form", "builder", "questionnaire", "quiz", "survey"] + "tags": [ + "form", + "builder", + "questionnaire", + "quiz", + "survey" + ] }, { "id": "chatwoot", @@ -1146,7 +1456,11 @@ "website": "https://www.chatwoot.com", "docs": "https://www.chatwoot.com/docs" }, - "tags": ["support", "chat", "customer-service"] + "tags": [ + "support", + "chat", + "customer-service" + ] }, { "id": "discourse", @@ -1159,7 +1473,11 @@ "website": "https://www.discourse.org/", "docs": "https://meta.discourse.org/" }, - "tags": ["forum", "community", "discussion"] + "tags": [ + "forum", + "community", + "discussion" + ] }, { "id": "immich", @@ -1172,7 +1490,12 @@ "website": "https://immich.app/", "docs": "https://immich.app/docs/overview/introduction" }, - "tags": ["photos", "videos", "backup", "media"] + "tags": [ + "photos", + "videos", + "backup", + "media" + ] }, { "id": "twenty", @@ -1185,7 +1508,11 @@ "website": "https://twenty.com", "docs": "https://docs.twenty.com" }, - "tags": ["crm", "sales", "business"] + "tags": [ + "crm", + "sales", + "business" + ] }, { "id": "yourls", @@ -1198,7 +1525,10 @@ "website": "https://yourls.org/", "docs": "https://yourls.org/#documentation" }, - "tags": ["url-shortener", "php"] + "tags": [ + "url-shortener", + "php" + ] }, { "id": "ryot", @@ -1211,7 +1541,11 @@ "website": "https://ryot.io/", "docs": "https://docs.ryot.io/" }, - "tags": ["media", "tracking", "self-hosted"] + "tags": [ + "media", + "tracking", + "self-hosted" + ] }, { "id": "photoprism", @@ -1224,7 +1558,11 @@ "website": "https://www.photoprism.app/", "docs": "https://docs.photoprism.app/" }, - "tags": ["media", "photos", "self-hosted"] + "tags": [ + "media", + "photos", + "self-hosted" + ] }, { "id": "ontime", @@ -1237,7 +1575,9 @@ "website": "https://getontime.no", "docs": "https://docs.getontime.no" }, - "tags": ["event"] + "tags": [ + "event" + ] }, { "id": "triggerdotdev", @@ -1250,7 +1590,10 @@ "website": "https://trigger.dev/", "docs": "https://trigger.dev/docs" }, - "tags": ["event-driven", "applications"] + "tags": [ + "event-driven", + "applications" + ] }, { "id": "browserless", @@ -1263,7 +1606,10 @@ "website": "https://www.browserless.io/", "docs": "https://docs.browserless.io/" }, - "tags": ["browser", "automation"] + "tags": [ + "browser", + "automation" + ] }, { "id": "drawio", @@ -1276,7 +1622,10 @@ "website": "https://draw.io/", "docs": "https://www.drawio.com/doc/" }, - "tags": ["drawing", "diagrams"] + "tags": [ + "drawing", + "diagrams" + ] }, { "id": "kimai", @@ -1289,7 +1638,11 @@ "website": "https://www.kimai.org", "docs": "https://www.kimai.org/documentation" }, - "tags": ["invoice", "business", "finance"] + "tags": [ + "invoice", + "business", + "finance" + ] }, { "id": "logto", @@ -1302,7 +1655,10 @@ "website": "https://logto.io/", "docs": "https://docs.logto.io/introduction" }, - "tags": ["identity", "auth"] + "tags": [ + "identity", + "auth" + ] }, { "id": "pocket-id", @@ -1315,7 +1671,10 @@ "website": "https://pocket-id.org/", "docs": "https://pocket-id.org/docs" }, - "tags": ["identity", "auth"] + "tags": [ + "identity", + "auth" + ] }, { "id": "penpot", @@ -1328,7 +1687,10 @@ "website": "https://penpot.app/", "docs": "https://docs.penpot.app/" }, - "tags": ["design", "collaboration"] + "tags": [ + "design", + "collaboration" + ] }, { "id": "huly", @@ -1341,7 +1703,11 @@ "website": "https://huly.io/", "docs": "https://docs.huly.io/" }, - "tags": ["project-management", "community", "discussion"] + "tags": [ + "project-management", + "community", + "discussion" + ] }, { "id": "unsend", @@ -1354,7 +1720,11 @@ "website": "https://unsend.dev/", "docs": "https://docs.unsend.dev/get-started/" }, - "tags": ["e-mail", "marketing", "business"] + "tags": [ + "e-mail", + "marketing", + "business" + ] }, { "id": "langflow", @@ -1367,7 +1737,9 @@ "website": "https://www.langflow.org/", "docs": "https://docs.langflow.org/" }, - "tags": ["ai"] + "tags": [ + "ai" + ] }, { "id": "elastic-search", @@ -1380,7 +1752,10 @@ "website": "https://www.elastic.co/elasticsearch/", "docs": "https://docs.elastic.co/elasticsearch/" }, - "tags": ["search", "analytics"] + "tags": [ + "search", + "analytics" + ] }, { "id": "onedev", @@ -1393,7 +1768,10 @@ "website": "https://onedev.io/", "docs": "https://docs.onedev.io/" }, - "tags": ["self-hosted", "development"] + "tags": [ + "self-hosted", + "development" + ] }, { "id": "unifi", @@ -1406,7 +1784,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", @@ -1419,7 +1800,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", @@ -1432,7 +1817,11 @@ "website": "https://bluewavelabs.ca", "docs": "https://bluewavelabs.gitbook.io/checkmate" }, - "tags": ["self-hosted", "monitoring", "uptime"] + "tags": [ + "self-hosted", + "monitoring", + "uptime" + ] }, { "id": "gotenberg", @@ -1445,7 +1834,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", @@ -1458,7 +1852,11 @@ "website": "https://actualbudget.org", "docs": "https://actualbudget.org/docs" }, - "tags": ["budgeting", "finance", "money"] + "tags": [ + "budgeting", + "finance", + "money" + ] }, { "id": "conduit", @@ -1471,7 +1869,10 @@ "website": "https://conduit.rs/", "docs": "https://docs.conduit.rs/" }, - "tags": ["matrix", "communication"] + "tags": [ + "matrix", + "communication" + ] }, { "id": "evolutionapi", @@ -1484,7 +1885,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", @@ -1497,7 +1902,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", @@ -1510,7 +1921,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", @@ -1523,7 +1939,10 @@ "website": "https://couchdb.apache.org/", "docs": "https://docs.couchdb.org/en/stable/" }, - "tags": ["database", "storage"] + "tags": [ + "database", + "storage" + ] }, { "id": "it-tools", @@ -1536,7 +1955,10 @@ "website": "https://it-tools.tech", "docs": "https://it-tools.tech/docs" }, - "tags": ["developer", "tools"] + "tags": [ + "developer", + "tools" + ] }, { "id": "superset", @@ -1549,7 +1971,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", @@ -1562,7 +1990,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", @@ -1575,7 +2008,10 @@ "docs": "https://homarr.dev/docs/getting-started/installation/docker", "website": "https://homarr.dev/" }, - "tags": ["dashboard", "monitoring"] + "tags": [ + "dashboard", + "monitoring" + ] }, { "id": "erpnext", @@ -1609,7 +2045,10 @@ "website": "https://maybe.finance/", "docs": "https://docs.maybe.finance/" }, - "tags": ["finance", "self-hosted"] + "tags": [ + "finance", + "self-hosted" + ] }, { "id": "spacedrive", @@ -1622,7 +2061,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", @@ -1635,7 +2078,11 @@ "docs": "https://distribution.github.io/distribution/" }, "logo": "registry.png", - "tags": ["registry", "docker", "self-hosted"] + "tags": [ + "registry", + "docker", + "self-hosted" + ] }, { "id": "alist", @@ -1648,7 +2095,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", @@ -1661,7 +2112,10 @@ "website": "https://answer.apache.org/", "docs": "https://answer.apache.org/docs" }, - "tags": ["q&a", "self-hosted"] + "tags": [ + "q&a", + "self-hosted" + ] }, { "id": "shlink", @@ -1674,7 +2128,11 @@ "website": "https://shlink.io", "docs": "https://shlink.io/documentation" }, - "tags": ["sharing", "shortener", "url"] + "tags": [ + "sharing", + "shortener", + "url" + ] }, { "id": "frappe-hr", @@ -1707,7 +2165,10 @@ "website": "https://formbricks.com/", "docs": "https://formbricks.com/docs" }, - "tags": ["forms", "analytics"] + "tags": [ + "forms", + "analytics" + ] }, { "id": "trilium", @@ -1720,7 +2181,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", @@ -1733,7 +2198,11 @@ "website": "https://www.convex.dev/", "docs": "https://www.convex.dev/docs" }, - "tags": ["backend", "database", "api"] + "tags": [ + "backend", + "database", + "api" + ] }, { "id": "wikijs", @@ -1746,7 +2215,11 @@ "website": "https://js.wiki/", "docs": "https://docs.requarks.io/" }, - "tags": ["knowledge-base", "self-hosted", "documentation"] + "tags": [ + "knowledge-base", + "self-hosted", + "documentation" + ] }, { "id": "otterwiki", @@ -1759,7 +2232,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", @@ -1772,7 +2250,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", @@ -1785,7 +2267,9 @@ "docs": "https://garethgeorge.github.io/backrest/introduction/getting-started" }, "logo": "backrest.svg", - "tags": ["backup"] + "tags": [ + "backup" + ] }, { "id": "blinko", @@ -1798,7 +2282,12 @@ "website": "https://blinko.space/", "docs": "https://docs.blinko.space/" }, - "tags": ["productivity", "organization", "workflow", "nextjs"] + "tags": [ + "productivity", + "organization", + "workflow", + "nextjs" + ] }, { "id": "pgadmin", @@ -1811,7 +2300,11 @@ "docs": "https://www.pgadmin.org/docs/" }, "logo": "pgadmin.webp", - "tags": ["database", "postgres", "admin"] + "tags": [ + "database", + "postgres", + "admin" + ] }, { "id": "ackee", @@ -1824,7 +2317,10 @@ "website": "https://ackee.electerious.com/", "docs": "https://docs.ackee.electerious.com/" }, - "tags": ["analytics", "self-hosted"] + "tags": [ + "analytics", + "self-hosted" + ] }, { "id": "adguardhome", @@ -1837,7 +2333,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", @@ -1850,7 +2351,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", @@ -1881,7 +2387,11 @@ "website": "https://github.com/Rudloff/alltube", "docs": "https://github.com/Rudloff/alltube/wiki" }, - "tags": ["media", "video", "downloader"] + "tags": [ + "media", + "video", + "downloader" + ] }, { "id": "ampache", @@ -1894,7 +2404,11 @@ "website": "http://ampache.org/", "docs": "https://github.com/ampache/ampache/wiki" }, - "tags": ["media", "music", "streaming"] + "tags": [ + "media", + "music", + "streaming" + ] }, { "id": "anythingllm", @@ -1907,7 +2421,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", @@ -1920,7 +2438,10 @@ "website": "https://github.com/caronc/apprise-api", "docs": "https://github.com/caronc/apprise-api/wiki" }, - "tags": ["notifications", "api"] + "tags": [ + "notifications", + "api" + ] }, { "id": "arangodb", @@ -1933,7 +2454,11 @@ "website": "https://www.arangodb.com/", "docs": "https://www.arangodb.com/docs/" }, - "tags": ["database", "graph-database", "nosql"] + "tags": [ + "database", + "graph-database", + "nosql" + ] }, { "id": "anonupload", @@ -1946,7 +2471,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", @@ -1959,7 +2487,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", @@ -1972,7 +2504,11 @@ "website": "https://www.audiobookshelf.org", "docs": "https://www.audiobookshelf.org/docs" }, - "tags": ["media", "audiobooks", "podcasts"] + "tags": [ + "media", + "audiobooks", + "podcasts" + ] }, { "id": "authorizer", @@ -1985,7 +2521,11 @@ "website": "https://authorizer.dev", "docs": "https://docs.authorizer.dev/" }, - "tags": ["authentication", "authorization", "security"] + "tags": [ + "authentication", + "authorization", + "security" + ] }, { "id": "automatisch", @@ -1998,7 +2538,11 @@ "website": "https://automatisch.io/docs", "docs": "https://automatisch.io/docs" }, - "tags": ["automation", "workflow", "integration"] + "tags": [ + "automation", + "workflow", + "integration" + ] }, { "id": "babybuddy", @@ -2011,7 +2555,11 @@ "website": "https://babybuddy.app", "docs": "https://docs.babybuddy.app" }, - "tags": ["parenting", "tracking", "family"] + "tags": [ + "parenting", + "tracking", + "family" + ] }, { "id": "baikal", @@ -2024,7 +2572,12 @@ "github": "https://sabre.io/baikal/", "docs": "https://sabre.io/baikal/install/" }, - "tags": ["calendar", "contacts", "caldav", "carddav"] + "tags": [ + "calendar", + "contacts", + "caldav", + "carddav" + ] }, { "id": "barrage", @@ -2037,7 +2590,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", @@ -2050,7 +2607,11 @@ "website": "https://www.bazarr.media/", "docs": "https://www.bazarr.media/docs" }, - "tags": ["subtitles", "sonarr", "radarr"] + "tags": [ + "subtitles", + "sonarr", + "radarr" + ] }, { "id": "beszel", @@ -2063,7 +2624,11 @@ "website": "https://beszel.dev", "docs": "https://beszel.dev/guide/getting-started" }, - "tags": ["monitoring", "docker", "alerts"] + "tags": [ + "monitoring", + "docker", + "alerts" + ] }, { "id": "bytestash", @@ -2076,7 +2641,10 @@ "website": "https://bytestash.com", "docs": "https://bytestash.com/docs" }, - "tags": ["file-storage", "self-hosted"] + "tags": [ + "file-storage", + "self-hosted" + ] }, { "id": "bookstack", @@ -2089,7 +2657,10 @@ "website": "https://www.bookstackapp.com", "docs": "https://www.bookstackapp.com/docs" }, - "tags": ["documentation", "self-hosted"] + "tags": [ + "documentation", + "self-hosted" + ] }, { "id": "bytebase", @@ -2102,7 +2673,10 @@ "website": "https://www.bytebase.com", "docs": "https://www.bytebase.com/docs" }, - "tags": ["database", "self-hosted"] + "tags": [ + "database", + "self-hosted" + ] }, { "id": "botpress", @@ -2115,7 +2689,10 @@ "website": "https://botpress.com", "docs": "https://botpress.com/docs" }, - "tags": ["ai", "self-hosted"] + "tags": [ + "ai", + "self-hosted" + ] }, { "id": "calibre", @@ -2128,7 +2705,10 @@ "website": "https://calibre-ebook.com/", "docs": "https://manual.calibre-ebook.com/" }, - "tags": ["Documents", "E-Commerce"] + "tags": [ + "Documents", + "E-Commerce" + ] }, { "id": "carbone", @@ -2141,7 +2721,12 @@ "website": "https://carbone.io/", "docs": "https://carbone.io/documentation/design/overview/getting-started.html" }, - "tags": ["Document Generation", "Automation", "Reporting", "Productivity"] + "tags": [ + "Document Generation", + "Automation", + "Reporting", + "Productivity" + ] }, { "id": "casdoor", @@ -2177,7 +2762,11 @@ "website": "https://changedetection.io", "docs": "https://github.com/dgtlmoon/changedetection.io/wiki" }, - "tags": ["Monitoring", "Data", "Notifications"] + "tags": [ + "Monitoring", + "Data", + "Notifications" + ] }, { "id": "chevereto", @@ -2228,7 +2817,11 @@ "website": "https://www.classicpress.net/", "docs": "https://docs.classicpress.net/" }, - "tags": ["cms", "wordpress", "content-management"] + "tags": [ + "cms", + "wordpress", + "content-management" + ] }, { "id": "cloud9", @@ -2241,7 +2834,11 @@ "website": "https://aws.amazon.com/cloud9/", "docs": "https://docs.aws.amazon.com/cloud9/" }, - "tags": ["ide", "development", "cloud"] + "tags": [ + "ide", + "development", + "cloud" + ] }, { "id": "cloudcommander", @@ -2254,7 +2851,11 @@ "website": "https://cloudcmd.io", "docs": "https://cloudcmd.io/#install" }, - "tags": ["file-manager", "web-based", "console"] + "tags": [ + "file-manager", + "web-based", + "console" + ] }, { "id": "cockpit", @@ -2267,7 +2868,11 @@ "website": "https://getcockpit.com", "docs": "https://getcockpit.com/documentation" }, - "tags": ["cms", "content-management", "api"] + "tags": [ + "cms", + "content-management", + "api" + ] }, { "id": "chromium", @@ -2280,7 +2885,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", @@ -2293,7 +2902,11 @@ "website": "https://codex.so", "docs": "https://docs.codex.so" }, - "tags": ["documentation", "development", "collaboration"] + "tags": [ + "documentation", + "development", + "collaboration" + ] }, { "id": "colanode", @@ -2306,7 +2919,11 @@ "website": "https://colanode.com", "docs": "https://colanode.com/docs/" }, - "tags": ["documentation", "knowledge-base", "collaboration"] + "tags": [ + "documentation", + "knowledge-base", + "collaboration" + ] }, { "id": "collabora-office", @@ -2319,7 +2936,11 @@ "website": "https://collaboraonline.com", "docs": "https://sdk.collaboraonline.com/docs" }, - "tags": ["office", "documents", "collaboration"] + "tags": [ + "office", + "documents", + "collaboration" + ] }, { "id": "confluence", @@ -2350,7 +2971,11 @@ "github": "https://github.com/souramoo/commentoplusplus" }, "logo": "logo.png", - "tags": ["comments", "discussion", "website"] + "tags": [ + "comments", + "discussion", + "website" + ] }, { "id": "commentoplusplus", @@ -2363,7 +2988,11 @@ "github": "https://github.com/souramoo/commentoplusplus" }, "logo": "logo.png", - "tags": ["comments", "website", "open-source"] + "tags": [ + "comments", + "website", + "open-source" + ] }, { "id": "coralproject", @@ -2376,7 +3005,11 @@ "github": "https://github.com/coralproject/talk" }, "logo": "logo.png", - "tags": ["communication", "community", "privacy"] + "tags": [ + "communication", + "community", + "privacy" + ] }, { "id": "rsshub", @@ -2389,7 +3022,11 @@ "website": "https://rsshub.app/", "docs": "https://docs.rsshub.app/" }, - "tags": ["rss", "api", "self-hosted"] + "tags": [ + "rss", + "api", + "self-hosted" + ] }, { "id": "tailscale-exitnode", @@ -2402,7 +3039,9 @@ "website": "https://tailscale.com/", "docs": "https://tailscale.com/kb/1408/quick-guide-exit-nodes" }, - "tags": ["network"] + "tags": [ + "network" + ] }, { "id": "homebridge", @@ -2415,7 +3054,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", @@ -2447,7 +3092,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", @@ -2460,7 +3109,12 @@ "website": "https://onetimesecret.com", "docs": "https://docs.onetimesecret.com" }, - "tags": ["auth", "password", "secret", "secure"] + "tags": [ + "auth", + "password", + "secret", + "secure" + ] }, { "id": "bugsink", @@ -2473,7 +3127,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", @@ -2486,7 +3144,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", @@ -2499,7 +3164,11 @@ "website": "https://qdrant.tech/", "docs": "https://qdrant.tech/documentation/" }, - "tags": ["vector-db", "database", "search"] + "tags": [ + "vector-db", + "database", + "search" + ] }, { "id": "trmnl-byos-laravel", @@ -2512,7 +3181,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", @@ -2525,7 +3196,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", @@ -2538,7 +3213,9 @@ "website": "https://rybbit.io", "docs": "https://www.rybbit.io/docs" }, - "tags": ["analytics"] + "tags": [ + "analytics" + ] }, { "id": "seafile", @@ -2551,7 +3228,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", @@ -2582,7 +3263,9 @@ "website": "https://www.docuseal.com/", "docs": "https://www.docuseal.com/" }, - "tags": ["document-signing"] + "tags": [ + "document-signing" + ] }, { "id": "kutt", @@ -2595,7 +3278,10 @@ "website": "https://kutt.it", "docs": "https://github.com/thedevs-network/kutt#kuttit" }, - "tags": ["link-shortener", "link-sharing"] + "tags": [ + "link-shortener", + "link-sharing" + ] }, { "id": "kener", @@ -2608,7 +3294,12 @@ "website": "https://kener.ing/", "docs": "https://kener.ing/docs/" }, - "tags": ["monitoring", "status-page", "alerting", "self-hosted"] + "tags": [ + "monitoring", + "status-page", + "alerting", + "self-hosted" + ] }, { "id": "palmr", @@ -2621,7 +3312,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", @@ -2703,7 +3398,12 @@ "website": "https://github.com/aldinokemal/go-whatsapp-web-multidevice", "docs": "https://github.com/aldinokemal/go-whatsapp-web-multidevice" }, - "tags": ["whatsapp", "self-hosted", "open-source", "api"] + "tags": [ + "whatsapp", + "self-hosted", + "open-source", + "api" + ] }, { "id": "rabbitmq", @@ -2716,7 +3416,11 @@ "website": "https://www.rabbitmq.com/", "docs": "https://www.rabbitmq.com/documentation.html" }, - "tags": ["message-broker", "queue", "rabbitmq"] + "tags": [ + "message-broker", + "queue", + "rabbitmq" + ] }, { "id": "ezbookkeeping", @@ -2772,7 +3476,11 @@ "website": "https://gchq.github.io/CyberChef/", "docs": "https://github.com/gchq/CyberChef/wiki" }, - "tags": ["security", "encryption", "data-analysis"] + "tags": [ + "security", + "encryption", + "data-analysis" + ] }, { "id": "filestash", @@ -2785,7 +3493,11 @@ "website": "https://www.filestash.app/", "docs": "https://www.filestash.app/docs/" }, - "tags": ["file-manager", "document-editor", "self-hosted"] + "tags": [ + "file-manager", + "document-editor", + "self-hosted" + ] }, { "id": "mazanoke", @@ -2798,7 +3510,13 @@ "website": "https://github.com/civilblur/mazanoke", "docs": "https://github.com/civilblur/mazanoke" }, - "tags": ["image-hosting", "file-sharing", "self-hosted", "media", "gallery"] + "tags": [ + "image-hosting", + "file-sharing", + "self-hosted", + "media", + "gallery" + ] }, { "id": "ihatemoney", @@ -2850,7 +3568,11 @@ "website": "https://www.usememos.com/", "docs": "https://www.usememos.com/docs" }, - "tags": ["productivity", "notes", "bookmarks"] + "tags": [ + "productivity", + "notes", + "bookmarks" + ] }, { "id": "linkstack", @@ -2863,7 +3585,12 @@ "website": "https://linkstack.org/", "docs": "https://docs.linkstack.org/" }, - "tags": ["bio", "personal", "cms", "php"] + "tags": [ + "bio", + "personal", + "cms", + "php" + ] }, { "id": "opengist", @@ -2876,7 +3603,12 @@ "website": "https://github.com/thomiceli/opengist", "docs": "https://github.com/thomiceli/opengist" }, - "tags": ["pastebin", "code", "snippets", "self-hosted"] + "tags": [ + "pastebin", + "code", + "snippets", + "self-hosted" + ] }, { "id": "snapp", @@ -2889,7 +3621,12 @@ "website": "https://github.com/UraniaDev/snapp", "docs": "https://github.com/UraniaDev/snapp" }, - "tags": ["screenshot", "sharing", "self-hosted", "authentication"] + "tags": [ + "screenshot", + "sharing", + "self-hosted", + "authentication" + ] }, { "id": "commafeed", @@ -2902,7 +3639,11 @@ "website": "https://www.commafeed.com/", "docs": "https://github.com/Athou/commafeed/wiki" }, - "tags": ["feed-reader", "news-aggregator", "rss"] + "tags": [ + "feed-reader", + "news-aggregator", + "rss" + ] }, { "id": "convertx", @@ -2915,7 +3656,11 @@ "website": "https://github.com/c4illin/ConvertX", "docs": "https://github.com/c4illin/ConvertX#environment-variables" }, - "tags": ["media", "converter", "ffmpeg"] + "tags": [ + "media", + "converter", + "ffmpeg" + ] }, { "id": "metube", @@ -2928,7 +3673,11 @@ "website": "https://github.com/alexta69/metube", "docs": "https://github.com/alexta69/metube/wiki" }, - "tags": ["downloader", "youtube", "media"] + "tags": [ + "downloader", + "youtube", + "media" + ] }, { "id": "pinchflat", @@ -2941,7 +3690,11 @@ "website": "https://github.com/kieraneglin/pinchflat", "docs": "https://github.com/kieraneglin/pinchflat" }, - "tags": ["youtube", "downloader", "media"] + "tags": [ + "youtube", + "downloader", + "media" + ] }, { "id": "yt-dlp-webui", @@ -2954,7 +3707,12 @@ "website": "https://github.com/marcopiovanello/yt-dlp-web-ui", "docs": "https://github.com/marcopiovanello/yt-dlp-web-ui" }, - "tags": ["downloader", "youtube", "media", "webui"] + "tags": [ + "downloader", + "youtube", + "media", + "webui" + ] }, { "id": "flaresolverr", @@ -2967,7 +3725,12 @@ "website": "https://github.com/FlareSolverr/FlareSolverr", "docs": "https://github.com/FlareSolverr/FlareSolverr" }, - "tags": ["proxy", "cloudflare", "bypass", "ddos-guard"] + "tags": [ + "proxy", + "cloudflare", + "bypass", + "ddos-guard" + ] }, { "id": "neko", @@ -2980,7 +3743,12 @@ "website": "https://github.com/m1k1o/neko", "docs": "https://github.com/m1k1o/neko" }, - "tags": ["browser", "virtual", "sharing", "remote"] + "tags": [ + "browser", + "virtual", + "sharing", + "remote" + ] }, { "id": "omni-tools", @@ -2993,7 +3761,12 @@ "website": "https://github.com/iib0011/omni-tools", "docs": "https://github.com/iib0011/omni-tools" }, - "tags": ["tools", "utilities", "collection", "self-hosted"] + "tags": [ + "tools", + "utilities", + "collection", + "self-hosted" + ] }, { "id": "openhands", @@ -3006,7 +3779,12 @@ "website": "https://github.com/all-hands-ai/OpenHands", "docs": "https://github.com/all-hands-ai/OpenHands" }, - "tags": ["ai", "agents", "llm", "openai"] + "tags": [ + "ai", + "agents", + "llm", + "openai" + ] }, { "id": "web-check", @@ -3019,7 +3797,12 @@ "website": "https://github.com/lissy93/web-check", "docs": "https://github.com/lissy93/web-check" }, - "tags": ["website-analyzer", "security", "performance", "seo"] + "tags": [ + "website-analyzer", + "security", + "performance", + "seo" + ] }, { "id": "dumbdrop", @@ -3032,7 +3815,11 @@ "website": "https://www.dumbware.io/software/DumbDrop/", "docs": "https://github.com/dumbwareio/dumbdrop" }, - "tags": ["file-sharing", "self-hosted", "simple"] + "tags": [ + "file-sharing", + "self-hosted", + "simple" + ] }, { "id": "dumbassets", @@ -3045,7 +3832,11 @@ "website": "https://www.dumbware.io/software/DumbAssets/", "docs": "https://github.com/dumbwareio/dumbassets" }, - "tags": ["asset-tracking", "self-hosted", "simple"] + "tags": [ + "asset-tracking", + "self-hosted", + "simple" + ] }, { "id": "dumbpad", @@ -3058,7 +3849,11 @@ "website": "https://www.dumbware.io/software/DumbPad/", "docs": "https://github.com/dumbwareio/dumbpad" }, - "tags": ["notepad", "self-hosted", "simple"] + "tags": [ + "notepad", + "self-hosted", + "simple" + ] }, { "id": "dumbbudget", @@ -3071,7 +3866,12 @@ "website": "https://www.dumbware.io/software/DumbBudget/", "docs": "https://github.com/dumbwareio/dumbbudget" }, - "tags": ["budget", "finance", "self-hosted", "simple"] + "tags": [ + "budget", + "finance", + "self-hosted", + "simple" + ] }, { "id": "tianji", @@ -3084,7 +3884,12 @@ "website": "https://github.com/msgbyte/tianji", "docs": "https://github.com/msgbyte/tianji" }, - "tags": ["analytics", "monitoring", "web", "uptime"] + "tags": [ + "analytics", + "monitoring", + "web", + "uptime" + ] }, { "id": "directory-lister", @@ -3097,7 +3902,11 @@ "website": "https://www.directorylister.com/", "docs": "https://docs.directorylister.com/" }, - "tags": ["file-manager", "directory-listing", "php"] + "tags": [ + "file-manager", + "directory-listing", + "php" + ] }, { "id": "grimoire", @@ -3110,7 +3919,11 @@ "website": "https://github.com/goniszewski/grimoire", "docs": "https://github.com/goniszewski/grimoire" }, - "tags": ["bookmarks", "self-hosted", "knowledge-management"] + "tags": [ + "bookmarks", + "self-hosted", + "knowledge-management" + ] }, { "id": "keycloak", @@ -3123,7 +3936,13 @@ "website": "https://www.keycloak.org/", "docs": "https://www.keycloak.org/documentation" }, - "tags": ["authentication", "identity", "sso", "oauth2", "openid-connect"] + "tags": [ + "authentication", + "identity", + "sso", + "oauth2", + "openid-connect" + ] }, { "id": "openpanel", @@ -3136,10 +3955,11 @@ "website": "https://openpanel.dev/", "docs": "https://openpanel.dev/docs" }, - "tags": ["analytics"] + "tags": [ + "analytics" + ] }, { - "id": "wg-easy", "name": "WG-Easy", "version": "15", @@ -3150,7 +3970,11 @@ "website": "https://wg-easy.github.io/", "docs": "https://github.com/wg-easy/wg-easy/wiki" }, - "tags": ["vpn", "wireguard", "networking"] + "tags": [ + "vpn", + "wireguard", + "networking" + ] }, { "id": "open_notebook", @@ -3163,7 +3987,12 @@ "website": "https://www.open-notebook.ai/", "docs": "https://www.open-notebook.ai/get-started.html" }, - "tags": ["notebook", "ai", "database", "surrealdb"] + "tags": [ + "notebook", + "ai", + "database", + "surrealdb" + ] }, { "id": "booklore", @@ -3176,7 +4005,12 @@ "website": "https://github.com/booklore-app/BookLore", "docs": "https://github.com/booklore-app/BookLore/tree/develop/docs" }, - "tags": ["books", "library", "database", "mariadb"] + "tags": [ + "books", + "library", + "database", + "mariadb" + ] }, { "id": "scrypted", @@ -3189,6 +4023,11 @@ "website": "https://www.scrypted.app/", "docs": "https://docs.scrypted.app/" }, - "tags": ["home-automation", "nvr", "smart-home", "surveillance"] + "tags": [ + "home-automation", + "nvr", + "smart-home", + "surveillance" + ] } -] +] \ No newline at end of file