diff --git a/.gitignore b/.gitignore
index 2f8606a3..904891b2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,3 @@
node_modules
package-lock.json
-meta.json.backup.*
+meta.json.backup.*
\ No newline at end of file
diff --git a/blueprints/alarik/alarik.png b/blueprints/alarik/alarik.png
new file mode 100644
index 00000000..cc05be94
Binary files /dev/null and b/blueprints/alarik/alarik.png differ
diff --git a/blueprints/alarik/docker-compose.yml b/blueprints/alarik/docker-compose.yml
new file mode 100644
index 00000000..b66fcd9b
--- /dev/null
+++ b/blueprints/alarik/docker-compose.yml
@@ -0,0 +1,30 @@
+services:
+ alarik:
+ image: ghcr.io/achtungsoftware/alarik:latest
+ restart: unless-stopped
+ volumes:
+ - alarik-storage:/app/Storage
+ environment:
+ - API_BASE_URL=${API_BASE_URL}
+ - CONSOLE_BASE_URL=${CONSOLE_BASE_URL}
+ - ADMIN_USERNAME=${ADMIN_USERNAME}
+ - ADMIN_PASSWORD=${ADMIN_PASSWORD}
+ - JWT=${JWT}
+ - ALLOW_ACCOUNT_CREATION=${ALLOW_ACCOUNT_CREATION}
+ expose:
+ - 8080
+
+ console:
+ image: ghcr.io/achtungsoftware/alarik-console:latest
+ restart: unless-stopped
+ environment:
+ - NUXT_PUBLIC_API_BASE_URL=${API_BASE_URL}
+ - NUXT_PUBLIC_CONSOLE_BASE_URL=${CONSOLE_BASE_URL}
+ - NUXT_PUBLIC_ALLOW_ACCOUNT_CREATION=${ALLOW_ACCOUNT_CREATION}
+ expose:
+ - 3000
+ depends_on:
+ - alarik
+
+volumes:
+ alarik-storage:
diff --git a/blueprints/alarik/template.toml b/blueprints/alarik/template.toml
new file mode 100644
index 00000000..df28f2ad
--- /dev/null
+++ b/blueprints/alarik/template.toml
@@ -0,0 +1,26 @@
+[variables]
+console_domain = "${domain}"
+api_domain = "${domain}"
+
+[config]
+mounts = []
+
+# S3-compatible API - point AWS CLI / SDKs / rclone / backup tools at this domain
+[[config.domains]]
+serviceName = "alarik"
+port = 8_080
+host = "${api_domain}"
+
+# Web management console - log in with the generated admin credentials below
+[[config.domains]]
+serviceName = "console"
+port = 3_000
+host = "${console_domain}"
+
+[config.env]
+API_BASE_URL = "http://${api_domain}"
+CONSOLE_BASE_URL = "http://${console_domain}"
+ADMIN_USERNAME = "alarik"
+ADMIN_PASSWORD = "${password:16}"
+JWT = "${base64:64}"
+ALLOW_ACCOUNT_CREATION = "false"
diff --git a/blueprints/archivebox/archivebox.svg b/blueprints/archivebox/archivebox.svg
new file mode 100644
index 00000000..be38ea52
--- /dev/null
+++ b/blueprints/archivebox/archivebox.svg
@@ -0,0 +1,5 @@
+
diff --git a/blueprints/archivebox/docker-compose.yml b/blueprints/archivebox/docker-compose.yml
new file mode 100644
index 00000000..2f149345
--- /dev/null
+++ b/blueprints/archivebox/docker-compose.yml
@@ -0,0 +1,16 @@
+services:
+ archivebox:
+ image: archivebox/archivebox:latest
+ restart: unless-stopped
+ command: server --quick-init 0.0.0.0:8000
+ environment:
+ ALLOWED_HOSTS: ${ALLOWED_HOSTS}
+ PUBLIC_INDEX: ${PUBLIC_INDEX}
+ PUBLIC_SNAPSHOTS: ${PUBLIC_SNAPSHOTS}
+ volumes:
+ - archivebox_data:/data
+ ports:
+ - "8000"
+
+volumes:
+ archivebox_data:
diff --git a/blueprints/archivebox/template.toml b/blueprints/archivebox/template.toml
new file mode 100644
index 00000000..edcc7fa8
--- /dev/null
+++ b/blueprints/archivebox/template.toml
@@ -0,0 +1,15 @@
+[variables]
+main_domain = "${domain}"
+
+[config]
+mounts = []
+
+[[config.domains]]
+serviceName = "archivebox"
+port = 8000
+host = "${main_domain}"
+
+[config.env]
+ALLOWED_HOSTS = "*"
+PUBLIC_INDEX = "True"
+PUBLIC_SNAPSHOTS = "True"
diff --git a/blueprints/chatto/docker-compose.yml b/blueprints/chatto/docker-compose.yml
new file mode 100644
index 00000000..3edb99d3
--- /dev/null
+++ b/blueprints/chatto/docker-compose.yml
@@ -0,0 +1,29 @@
+version: "3.8"
+
+services:
+ chatto:
+ image: ghcr.io/chattocorp/chatto:0.3.8
+ restart: unless-stopped
+ expose:
+ - "4000"
+ environment:
+ CHATTO_WEBSERVER_URL: https://${CHATTO_HOST}
+ CHATTO_WEBSERVER_PORT: "4000"
+ CHATTO_WEBSERVER_COOKIE_SIGNING_SECRET: ${CHATTO_COOKIE_SECRET}
+ CHATTO_CORE_SECRET_KEY: ${CHATTO_CORE_SECRET}
+ CHATTO_CORE_ASSETS_SIGNING_SECRET: ${CHATTO_ASSETS_SECRET}
+ CHATTO_NATS_EMBEDDED_ENABLED: true
+ CHATTO_NATS_EMBEDDED_DATA_DIR: /data
+ CHATTO_OWNERS_EMAILS: ${CHATTO_OWNER_EMAIL}
+ CHATTO_SMTP_ENABLED: ${CHATTO_SMTP_ENABLED:-false}
+ CHATTO_SMTP_HOST: ${CHATTO_SMTP_HOST:-}
+ CHATTO_SMTP_PORT: ${CHATTO_SMTP_PORT:-587}
+ CHATTO_SMTP_TLS: ${CHATTO_SMTP_TLS:-mandatory}
+ CHATTO_SMTP_USERNAME: ${CHATTO_SMTP_USERNAME:-}
+ CHATTO_SMTP_PASSWORD: ${CHATTO_SMTP_PASSWORD:-}
+ CHATTO_SMTP_FROM: ${CHATTO_SMTP_FROM:-}
+ volumes:
+ - chatto-data:/data
+
+volumes:
+ chatto-data:
diff --git a/blueprints/chatto/logo.png b/blueprints/chatto/logo.png
new file mode 100644
index 00000000..81928507
Binary files /dev/null and b/blueprints/chatto/logo.png differ
diff --git a/blueprints/chatto/template.toml b/blueprints/chatto/template.toml
new file mode 100644
index 00000000..5d8570ef
--- /dev/null
+++ b/blueprints/chatto/template.toml
@@ -0,0 +1,21 @@
+[variables]
+main_domain = "${domain}"
+cookie_secret = "${hash:64}"
+core_secret = "${hash:64}"
+assets_secret = "${hash:64}"
+owner_email = "${email}"
+
+[config]
+env = [
+ "CHATTO_HOST=${main_domain}",
+ "CHATTO_COOKIE_SECRET=${cookie_secret}",
+ "CHATTO_CORE_SECRET=${core_secret}",
+ "CHATTO_ASSETS_SECRET=${assets_secret}",
+ "CHATTO_OWNER_EMAIL=${owner_email}",
+]
+mounts = []
+
+[[config.domains]]
+serviceName = "chatto"
+port = 4000
+host = "${main_domain}"
diff --git a/blueprints/dockge/docker-compose.yml b/blueprints/dockge/docker-compose.yml
new file mode 100644
index 00000000..8736f2fd
--- /dev/null
+++ b/blueprints/dockge/docker-compose.yml
@@ -0,0 +1,16 @@
+services:
+ dockge:
+ image: louislam/dockge:1
+ restart: unless-stopped
+ volumes:
+ - /var/run/docker.sock:/var/run/docker.sock
+ - dockge_data:/app/data
+ - dockge_stacks:/opt/stacks
+ environment:
+ DOCKGE_STACKS_DIR: /opt/stacks
+ ports:
+ - "5001"
+
+volumes:
+ dockge_data:
+ dockge_stacks:
diff --git a/blueprints/dockge/dockge.svg b/blueprints/dockge/dockge.svg
new file mode 100644
index 00000000..69ade613
--- /dev/null
+++ b/blueprints/dockge/dockge.svg
@@ -0,0 +1,5 @@
+
diff --git a/blueprints/dockge/template.toml b/blueprints/dockge/template.toml
new file mode 100644
index 00000000..79d8a24f
--- /dev/null
+++ b/blueprints/dockge/template.toml
@@ -0,0 +1,11 @@
+[variables]
+main_domain = "${domain}"
+
+[config]
+env = {}
+mounts = []
+
+[[config.domains]]
+serviceName = "dockge"
+port = 5001
+host = "${main_domain}"
diff --git a/blueprints/filegator/docker-compose.yml b/blueprints/filegator/docker-compose.yml
new file mode 100644
index 00000000..f2f73351
--- /dev/null
+++ b/blueprints/filegator/docker-compose.yml
@@ -0,0 +1,13 @@
+services:
+ filegator:
+ image: filegator/filegator:v7.14.3
+ restart: unless-stopped
+ volumes:
+ - filegator_repository:/var/www/filegator/repository
+ - filegator_private:/var/www/filegator/private
+ ports:
+ - "8080"
+
+volumes:
+ filegator_repository:
+ filegator_private:
diff --git a/blueprints/filegator/filegator.svg b/blueprints/filegator/filegator.svg
new file mode 100644
index 00000000..7f09ba2d
--- /dev/null
+++ b/blueprints/filegator/filegator.svg
@@ -0,0 +1,5 @@
+
diff --git a/blueprints/filegator/template.toml b/blueprints/filegator/template.toml
new file mode 100644
index 00000000..8646a0c7
--- /dev/null
+++ b/blueprints/filegator/template.toml
@@ -0,0 +1,11 @@
+[variables]
+main_domain = "${domain}"
+
+[config]
+env = {}
+mounts = []
+
+[[config.domains]]
+serviceName = "filegator"
+port = 8080
+host = "${main_domain}"
diff --git a/blueprints/firefly-iii/README.md b/blueprints/firefly-iii/README.md
new file mode 100644
index 00000000..1687baf8
--- /dev/null
+++ b/blueprints/firefly-iii/README.md
@@ -0,0 +1,13 @@
+# Firefly III
+
+Firefly III is a self-hosted personal finance manager for budgets, accounts, transactions, categories, and reports.
+
+This Dokploy template includes:
+
+- Firefly III core web application
+- MariaDB database with generated credentials
+- Persistent upload and database volumes
+- Daily cron runner using Firefly III's static cron token
+- Dokploy domain routing on the application service
+
+After deployment, open the generated domain and complete the first-user setup flow.
diff --git a/blueprints/firefly-iii/docker-compose.yml b/blueprints/firefly-iii/docker-compose.yml
new file mode 100644
index 00000000..b9823407
--- /dev/null
+++ b/blueprints/firefly-iii/docker-compose.yml
@@ -0,0 +1,65 @@
+version: "3.8"
+
+services:
+ firefly-iii:
+ image: fireflyiii/core:version-6.6.3
+ restart: unless-stopped
+ depends_on:
+ firefly-iii-db:
+ condition: service_healthy
+ environment:
+ APP_KEY: ${APP_KEY}
+ APP_URL: ${APP_URL}
+ TRUSTED_PROXIES: "**"
+ TZ: ${TZ}
+ SITE_OWNER: ${SITE_OWNER}
+ DEFAULT_LANGUAGE: ${DEFAULT_LANGUAGE}
+ DEFAULT_LOCALE: ${DEFAULT_LOCALE}
+ DB_CONNECTION: mysql
+ DB_HOST: firefly-iii-db
+ DB_PORT: 3306
+ DB_DATABASE: ${DB_DATABASE}
+ DB_USERNAME: ${DB_USERNAME}
+ DB_PASSWORD: ${DB_PASSWORD}
+ STATIC_CRON_TOKEN: ${STATIC_CRON_TOKEN}
+ expose:
+ - "8080"
+ volumes:
+ - firefly-iii-upload:/var/www/html/storage/upload
+
+ firefly-iii-db:
+ image: mariadb:11.8
+ restart: unless-stopped
+ environment:
+ MYSQL_DATABASE: ${DB_DATABASE}
+ MYSQL_USER: ${DB_USERNAME}
+ MYSQL_PASSWORD: ${DB_PASSWORD}
+ MYSQL_RANDOM_ROOT_PASSWORD: "yes"
+ volumes:
+ - firefly-iii-db:/var/lib/mysql
+ healthcheck:
+ test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ firefly-iii-cron:
+ image: alpine:3.22
+ restart: unless-stopped
+ depends_on:
+ - firefly-iii
+ environment:
+ TZ: ${TZ}
+ STATIC_CRON_TOKEN: ${STATIC_CRON_TOKEN}
+ command:
+ - sh
+ - -c
+ - |
+ apk add --no-cache tzdata wget && \
+ (ln -snf /usr/share/zoneinfo/$$TZ /etc/localtime || true) && \
+ echo "0 3 * * * wget -qO- http://firefly-iii:8080/api/v1/cron/$$STATIC_CRON_TOKEN; echo" | crontab - && \
+ crond -f -L /dev/stdout
+
+volumes:
+ firefly-iii-upload: {}
+ firefly-iii-db: {}
diff --git a/blueprints/firefly-iii/logo.svg b/blueprints/firefly-iii/logo.svg
new file mode 100644
index 00000000..8b4b7d2c
--- /dev/null
+++ b/blueprints/firefly-iii/logo.svg
@@ -0,0 +1,14 @@
+
diff --git a/blueprints/firefly-iii/template.toml b/blueprints/firefly-iii/template.toml
new file mode 100644
index 00000000..3f02a8ae
--- /dev/null
+++ b/blueprints/firefly-iii/template.toml
@@ -0,0 +1,36 @@
+[variables]
+main_domain = "${domain}"
+app_key = "${base64:32}"
+db_name = "firefly"
+db_user = "firefly"
+db_password = "${password:32}"
+cron_token = "${hash:32}"
+site_owner = "${email}"
+timezone = "UTC"
+default_language = "en_US"
+default_locale = "equal"
+
+[config]
+env = [
+ "APP_KEY=base64:${app_key}",
+ "APP_URL=https://${main_domain}",
+ "TRUSTED_PROXIES=**",
+ "TZ=${timezone}",
+ "SITE_OWNER=${site_owner}",
+ "DEFAULT_LANGUAGE=${default_language}",
+ "DEFAULT_LOCALE=${default_locale}",
+ "DB_DATABASE=${db_name}",
+ "DB_USERNAME=${db_user}",
+ "DB_PASSWORD=${db_password}",
+ "STATIC_CRON_TOKEN=${cron_token}",
+ "MYSQL_DATABASE=${db_name}",
+ "MYSQL_USER=${db_user}",
+ "MYSQL_PASSWORD=${db_password}",
+ "MYSQL_RANDOM_ROOT_PASSWORD=yes"
+]
+mounts = []
+
+[[config.domains]]
+serviceName = "firefly-iii"
+port = 8080
+host = "${main_domain}"
diff --git a/blueprints/gotify/docker-compose.yml b/blueprints/gotify/docker-compose.yml
new file mode 100644
index 00000000..1d3d8265
--- /dev/null
+++ b/blueprints/gotify/docker-compose.yml
@@ -0,0 +1,11 @@
+services:
+ gotify:
+ image: gotify/server:2.9.1
+ restart: unless-stopped
+ volumes:
+ - gotify_data:/app/data
+ ports:
+ - "80"
+
+volumes:
+ gotify_data:
diff --git a/blueprints/gotify/gotify.svg b/blueprints/gotify/gotify.svg
new file mode 100644
index 00000000..29502b8a
--- /dev/null
+++ b/blueprints/gotify/gotify.svg
@@ -0,0 +1,5 @@
+
diff --git a/blueprints/gotify/template.toml b/blueprints/gotify/template.toml
new file mode 100644
index 00000000..2308838a
--- /dev/null
+++ b/blueprints/gotify/template.toml
@@ -0,0 +1,11 @@
+[variables]
+main_domain = "${domain}"
+
+[config]
+env = {}
+mounts = []
+
+[[config.domains]]
+serviceName = "gotify"
+port = 80
+host = "${main_domain}"
diff --git a/blueprints/hermes/docker-compose.yml b/blueprints/hermes/docker-compose.yml
new file mode 100644
index 00000000..6e915e33
--- /dev/null
+++ b/blueprints/hermes/docker-compose.yml
@@ -0,0 +1,27 @@
+version: "3.8"
+services:
+ hermes:
+ image: nousresearch/hermes-agent:v2026.6.19
+ restart: unless-stopped
+ command: gateway run
+ ports:
+ - 9119
+ - 8642
+ environment:
+ - HERMES_DASHBOARD=${HERMES_DASHBOARD}
+ - HERMES_DASHBOARD_BASIC_AUTH_USERNAME=${HERMES_DASHBOARD_BASIC_AUTH_USERNAME}
+ - HERMES_DASHBOARD_BASIC_AUTH_PASSWORD=${HERMES_DASHBOARD_BASIC_AUTH_PASSWORD}
+ - HERMES_DASHBOARD_BASIC_AUTH_SECRET=${HERMES_DASHBOARD_BASIC_AUTH_SECRET}
+ - API_SERVER_ENABLED=${API_SERVER_ENABLED}
+ - API_SERVER_HOST=${API_SERVER_HOST}
+ - API_SERVER_KEY=${API_SERVER_KEY}
+ volumes:
+ - hermes_data:/opt/data
+ deploy:
+ resources:
+ limits:
+ memory: 4G
+ cpus: "2.0"
+
+volumes:
+ hermes_data:
diff --git a/blueprints/hermes/logo.png b/blueprints/hermes/logo.png
new file mode 100644
index 00000000..2d629d2f
Binary files /dev/null and b/blueprints/hermes/logo.png differ
diff --git a/blueprints/hermes/template.toml b/blueprints/hermes/template.toml
new file mode 100644
index 00000000..b028624f
--- /dev/null
+++ b/blueprints/hermes/template.toml
@@ -0,0 +1,33 @@
+[variables]
+dashboard_domain = "${domain}"
+gateway_domain = "${domain}"
+# base64 (not just alphanumeric); 96 bytes -> 128 chars
+dashboard_password = "${base64:96}"
+dashboard_secret = "${base64:32}"
+api_key = "${password:32}"
+
+[config]
+mounts = []
+
+# Web dashboard (HERMES_DASHBOARD=1). Exposed behind Traefik, so Hermes'
+# auth-gated mode kicks in — protect it with the bundled basic-auth provider.
+[[config.domains]]
+serviceName = "hermes"
+port = 9119
+host = "${dashboard_domain}"
+
+# OpenAI-compatible gateway API. Disabled and loopback-bound by default,
+# so it must be enabled, bound to 0.0.0.0, and given a bearer token.
+[[config.domains]]
+serviceName = "hermes"
+port = 8642
+host = "${gateway_domain}"
+
+[config.env]
+HERMES_DASHBOARD = "1"
+HERMES_DASHBOARD_BASIC_AUTH_USERNAME = "admin"
+HERMES_DASHBOARD_BASIC_AUTH_PASSWORD = "${dashboard_password}"
+HERMES_DASHBOARD_BASIC_AUTH_SECRET = "${dashboard_secret}"
+API_SERVER_ENABLED = "true"
+API_SERVER_HOST = "0.0.0.0"
+API_SERVER_KEY = "${api_key}"
diff --git a/blueprints/inkvoice/docker-compose.yml b/blueprints/inkvoice/docker-compose.yml
new file mode 100644
index 00000000..bd275006
--- /dev/null
+++ b/blueprints/inkvoice/docker-compose.yml
@@ -0,0 +1,22 @@
+version: "3.8"
+services:
+ inkvoice:
+ image: ghcr.io/pigontech/inkvoice:0.1.0
+ restart: unless-stopped
+ environment:
+ - ADMIN_USER=${ADMIN_USER}
+ - ADMIN_PASS=${ADMIN_PASS}
+ - JWT_SECRET=${JWT_SECRET}
+ - DATABASE_PATH=/app/data/invoice.db
+ - PORT=3000
+ - HOST=0.0.0.0
+ # Dokploy's auto-generated domain is HTTP (sslip.io); keep false so login
+ # works out of the box. Set true once you attach an HTTPS custom domain.
+ - COOKIE_SECURE=false
+ volumes:
+ - inkvoice-data:/app/data
+ expose:
+ - 3000
+
+volumes:
+ inkvoice-data:
diff --git a/blueprints/inkvoice/inkvoice.svg b/blueprints/inkvoice/inkvoice.svg
new file mode 100644
index 00000000..788f0558
--- /dev/null
+++ b/blueprints/inkvoice/inkvoice.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/blueprints/inkvoice/template.toml b/blueprints/inkvoice/template.toml
new file mode 100644
index 00000000..0ce2dafc
--- /dev/null
+++ b/blueprints/inkvoice/template.toml
@@ -0,0 +1,17 @@
+[variables]
+main_domain = "${domain}"
+admin_user = "admin"
+admin_pass = "${password:16}"
+jwt_secret = "${password:48}"
+
+[config]
+env = [
+ "ADMIN_USER=${admin_user}",
+ "ADMIN_PASS=${admin_pass}",
+ "JWT_SECRET=${jwt_secret}",
+]
+
+[[config.domains]]
+serviceName = "inkvoice"
+port = 3000
+host = "${main_domain}"
diff --git a/blueprints/jellyseerr/docker-compose.yml b/blueprints/jellyseerr/docker-compose.yml
new file mode 100644
index 00000000..e17f3ddb
--- /dev/null
+++ b/blueprints/jellyseerr/docker-compose.yml
@@ -0,0 +1,13 @@
+services:
+ jellyseerr:
+ image: fallenbagel/jellyseerr:2.7.3
+ restart: unless-stopped
+ volumes:
+ - jellyseerr_config:/app/config
+ environment:
+ LOG_LEVEL: info
+ ports:
+ - "5055"
+
+volumes:
+ jellyseerr_config:
diff --git a/blueprints/jellyseerr/jellyseerr.svg b/blueprints/jellyseerr/jellyseerr.svg
new file mode 100644
index 00000000..93840c4a
--- /dev/null
+++ b/blueprints/jellyseerr/jellyseerr.svg
@@ -0,0 +1,5 @@
+
diff --git a/blueprints/jellyseerr/template.toml b/blueprints/jellyseerr/template.toml
new file mode 100644
index 00000000..b41dae81
--- /dev/null
+++ b/blueprints/jellyseerr/template.toml
@@ -0,0 +1,11 @@
+[variables]
+main_domain = "${domain}"
+
+[config]
+env = {}
+mounts = []
+
+[[config.domains]]
+serviceName = "jellyseerr"
+port = 5055
+host = "${main_domain}"
diff --git a/blueprints/joplin-server/docker-compose.yml b/blueprints/joplin-server/docker-compose.yml
new file mode 100644
index 00000000..fefac15b
--- /dev/null
+++ b/blueprints/joplin-server/docker-compose.yml
@@ -0,0 +1,30 @@
+services:
+ joplin-db:
+ image: postgres:16-alpine
+ restart: unless-stopped
+ environment:
+ POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
+ POSTGRES_USER: ${POSTGRES_USER}
+ POSTGRES_DB: ${POSTGRES_DATABASE}
+ volumes:
+ - joplin_db_data:/var/lib/postgresql/data
+
+ joplin-server:
+ image: joplin/server:3.7.1
+ restart: unless-stopped
+ depends_on:
+ - joplin-db
+ environment:
+ APP_BASE_URL: ${APP_BASE_URL}
+ APP_PORT: ${APP_PORT}
+ DB_CLIENT: pg
+ POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
+ POSTGRES_DATABASE: ${POSTGRES_DATABASE}
+ POSTGRES_USER: ${POSTGRES_USER}
+ POSTGRES_PORT: 5432
+ POSTGRES_HOST: joplin-db
+ ports:
+ - "22300"
+
+volumes:
+ joplin_db_data:
diff --git a/blueprints/joplin-server/joplin-server.svg b/blueprints/joplin-server/joplin-server.svg
new file mode 100644
index 00000000..93840c4a
--- /dev/null
+++ b/blueprints/joplin-server/joplin-server.svg
@@ -0,0 +1,5 @@
+
diff --git a/blueprints/joplin-server/template.toml b/blueprints/joplin-server/template.toml
new file mode 100644
index 00000000..f8258bc6
--- /dev/null
+++ b/blueprints/joplin-server/template.toml
@@ -0,0 +1,18 @@
+[variables]
+main_domain = "${domain}"
+postgres_password = "${password:32}"
+
+[config]
+mounts = []
+
+[[config.domains]]
+serviceName = "joplin-server"
+port = 22300
+host = "${main_domain}"
+
+[config.env]
+APP_BASE_URL = "http://${main_domain}"
+APP_PORT = "22300"
+POSTGRES_PASSWORD = "${postgres_password}"
+POSTGRES_USER = "joplin"
+POSTGRES_DATABASE = "joplin"
diff --git a/blueprints/ollama-chat-tone/docker-compose.yml b/blueprints/ollama-chat-tone/docker-compose.yml
new file mode 100644
index 00000000..8605f824
--- /dev/null
+++ b/blueprints/ollama-chat-tone/docker-compose.yml
@@ -0,0 +1,21 @@
+services:
+ ollama-chat-tone:
+ image: billnice250/chattone:latest
+ ports:
+ - 8080
+ environment:
+ APP_NAME: "Ollama Chat Tone"
+ ADDR: ":8080"
+ SESSION_SECRET: "${SESSION_SECRET}"
+ DB_PATH: "/data/app.db"
+ OLLAMA_URL: "${OLLAMA_URL}"
+ OLLAMA_TIMEOUT: "${OLLAMA_TIMEOUT}"
+ DEFAULT_MODEL: "${DEFAULT_MODEL}"
+ OPEN_BROWSER: "false"
+ BASIC_AUTH_USER: "${BASIC_AUTH_USER}"
+ BASIC_AUTH_PASSWORD: "${BASIC_AUTH_PASSWORD}"
+ volumes:
+ - ollama-chat-tone-data:/data
+
+volumes:
+ ollama-chat-tone-data: {}
diff --git a/blueprints/ollama-chat-tone/ollama-chat-tone.svg b/blueprints/ollama-chat-tone/ollama-chat-tone.svg
new file mode 100644
index 00000000..b90a86a1
--- /dev/null
+++ b/blueprints/ollama-chat-tone/ollama-chat-tone.svg
@@ -0,0 +1,8 @@
+
diff --git a/blueprints/ollama-chat-tone/template.toml b/blueprints/ollama-chat-tone/template.toml
new file mode 100644
index 00000000..2ab6ae27
--- /dev/null
+++ b/blueprints/ollama-chat-tone/template.toml
@@ -0,0 +1,32 @@
+[variables]
+main_domain = "${domain}"
+session_secret = "change-me......32charsOrMore"
+ollama_url = "http://your-ollama-host:11434"
+ollama_timeout = "5"
+default_model = "llama3.2"
+basic_auth_user = "admin"
+basic_auth_password = "change-me"
+
+[config]
+[[config.domains]]
+serviceName = "ollama-chat-tone"
+port = 8080
+host = "${main_domain}"
+path = "/"
+
+[config.env]
+APP_NAME = "Ollama Chat Tone"
+ADDR = ":8080"
+SESSION_SECRET = "${session_secret}"
+DB_PATH = "/data/app.db"
+OLLAMA_URL = "${ollama_url}"
+OLLAMA_TIMEOUT = "${ollama_timeout}"
+DEFAULT_MODEL = "${default_model}"
+OPEN_BROWSER = "false"
+BASIC_AUTH_USER = "${basic_auth_user}"
+BASIC_AUTH_PASSWORD = "${basic_auth_password}"
+
+[[config.mounts]]
+serviceName = "ollama-chat-tone"
+filePath = "/data/app.db"
+content = ""
diff --git a/blueprints/registry/docker-compose.yml b/blueprints/registry/docker-compose.yml
index 08c5c368..a86455d4 100644
--- a/blueprints/registry/docker-compose.yml
+++ b/blueprints/registry/docker-compose.yml
@@ -1,19 +1,35 @@
services:
registry:
- restart: always
- image: registry:2
- ports:
- - 5000
- volumes:
- - ../files/auth/registry.password:/auth/registry.password
- - registry-data:/var/lib/registry
+ image: registry:3
+ restart: unless-stopped
environment:
- REGISTRY_STORAGE_DELETE_ENABLED: true
- REGISTRY_HEALTH_STORAGEDRIVER_ENABLED: false
- REGISTRY_HTTP_SECRET: ${REGISTRY_HTTP_SECRET}
- REGISTRY_AUTH: htpasswd
- REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
- REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.password
+ - USERNAME=${USERNAME}
+ - PASSWORD=${PASSWORD}
+ - REGISTRY_AUTH=htpasswd
+ - REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm
+ - REGISTRY_AUTH_HTPASSWD_PATH=/auth/registry.password
+ - REGISTRY_HTTP_RELATIVEURLS=true
+ entrypoint: ["sh", "/entrypoint.sh"]
+ volumes:
+ - registry-data:/var/lib/registry
+ - type: bind
+ source: ../files/entrypoint.sh
+ target: /entrypoint.sh
+ - type: bind
+ source: ../files/config.yml
+ target: /etc/docker/registry/config.yml
+ expose:
+ - 5000
+ healthcheck:
+ test:
+ - CMD
+ - wget
+ - "-q"
+ - "--spider"
+ - "http://localhost:5000/"
+ interval: 5s
+ timeout: 20s
+ retries: 10
volumes:
- registry-data:
\ No newline at end of file
+ registry-data:
diff --git a/blueprints/registry/template.toml b/blueprints/registry/template.toml
index a61ca406..a2a16530 100644
--- a/blueprints/registry/template.toml
+++ b/blueprints/registry/template.toml
@@ -1,6 +1,7 @@
[variables]
main_domain = "${domain}"
-registry_http_secret = "${password:30}"
+username = "${username}"
+password = "${password:32}"
[[config.domains]]
serviceName = "registry"
@@ -8,11 +9,48 @@ port = 5_000
host = "${main_domain}"
[config.env]
-REGISTRY_HTTP_SECRET = "${registry_http_secret}"
+USERNAME = "${username}"
+PASSWORD = "${password}"
[[config.mounts]]
-filePath = "/auth/registry.password"
+filePath = "./config.yml"
content = """
-# from: docker run --rm --entrypoint htpasswd httpd:2 -Bbn docker password
-docker:$2y$10$qWZoWev/u5PV7WneFoRAMuoGpRcAQOgUuIIdLnU7pJXogrBSY23/2
+version: 0.1
+
+log:
+ fields:
+ service: registry
+storage:
+ cache:
+ blobdescriptor: inmemory
+ filesystem:
+ rootdirectory: /var/lib/registry
+http:
+ addr: :5000
+ headers:
+ X-Content-Type-Options: [nosniff]
+health:
+ storagedriver:
+ enabled: true
+ interval: 10s
+ threshold: 3
+"""
+
+[[config.mounts]]
+filePath = "./entrypoint.sh"
+content = """
+#!/usr/bin/env sh
+
+set -e
+
+if [ -z "$USERNAME" ] || [ -z "$PASSWORD" ]; then
+ echo "Error: USERNAME and PASSWORD environment variables must be set"
+ exit 1
+fi
+
+apk add --no-cache apache2-utils
+mkdir -p "$(dirname "$REGISTRY_AUTH_HTPASSWD_PATH")"
+chmod 755 "$(dirname "$REGISTRY_AUTH_HTPASSWD_PATH")"
+htpasswd -Bbc "$REGISTRY_AUTH_HTPASSWD_PATH" "$USERNAME" "$PASSWORD"
+registry serve /etc/docker/registry/config.yml
"""
diff --git a/blueprints/sftpgo/docker-compose.yml b/blueprints/sftpgo/docker-compose.yml
new file mode 100644
index 00000000..2cd48773
--- /dev/null
+++ b/blueprints/sftpgo/docker-compose.yml
@@ -0,0 +1,14 @@
+services:
+ sftpgo:
+ image: drakkan/sftpgo:v2.7.3
+ restart: unless-stopped
+ volumes:
+ - sftpgo_data:/srv/sftpgo
+ - sftpgo_home:/var/lib/sftpgo
+ ports:
+ - "8080"
+ - "2022"
+
+volumes:
+ sftpgo_data:
+ sftpgo_home:
diff --git a/blueprints/sftpgo/sftpgo.svg b/blueprints/sftpgo/sftpgo.svg
new file mode 100644
index 00000000..1928bbb7
--- /dev/null
+++ b/blueprints/sftpgo/sftpgo.svg
@@ -0,0 +1,5 @@
+
diff --git a/blueprints/sftpgo/template.toml b/blueprints/sftpgo/template.toml
new file mode 100644
index 00000000..12437970
--- /dev/null
+++ b/blueprints/sftpgo/template.toml
@@ -0,0 +1,11 @@
+[variables]
+main_domain = "${domain}"
+
+[config]
+env = {}
+mounts = []
+
+[[config.domains]]
+serviceName = "sftpgo"
+port = 8080
+host = "${main_domain}"
diff --git a/blueprints/spliit/docker-compose.yml b/blueprints/spliit/docker-compose.yml
new file mode 100644
index 00000000..69b4acd9
--- /dev/null
+++ b/blueprints/spliit/docker-compose.yml
@@ -0,0 +1,28 @@
+services:
+ spliit:
+ image: ghcr.io/spliit-app/spliit:1.19.0
+ restart: unless-stopped
+ env_file:
+ - .env
+ depends_on:
+ spliit-db:
+ condition: service_healthy
+ spliit-db:
+ image: pgvector/pgvector:pg16
+ volumes:
+ - ${DB_DATA_LOCATION}:/var/lib/DBql/data
+ environment:
+ POSTGRES_USER: ${DB_USERNAME}
+ POSTGRES_PASSWORD: ${DB_PASSWORD}
+ POSTGRES_DB: ${DB_DATABASE:-spliit}
+ POSTGRES_INITDB_ARGS: '--data-checksums'
+ POSTGRES_HOST_AUTH_METHOD: trust
+ healthcheck:
+ test:
+ ['CMD', 'pg_isready', '-U', "${DB_USERNAME}", '-d', "${DB_DATABASE:-spliit}"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+ restart: unless-stopped
+ env_file:
+ - .env
\ No newline at end of file
diff --git a/blueprints/spliit/spliit.png b/blueprints/spliit/spliit.png
new file mode 100644
index 00000000..3ac8cdb4
Binary files /dev/null and b/blueprints/spliit/spliit.png differ
diff --git a/blueprints/spliit/template.toml b/blueprints/spliit/template.toml
new file mode 100644
index 00000000..528072ab
--- /dev/null
+++ b/blueprints/spliit/template.toml
@@ -0,0 +1,24 @@
+
+[variables]
+main_domain = "${domain}"
+secret_key = "${password}"
+project_name = "spliit"
+
+[config]
+mounts = []
+
+[[config.domains]]
+serviceName = "spliit"
+port = 3000
+host = "${main_domain}"
+
+[config.env]
+
+DB_USERNAME = "${project_name}-admin"
+DB_PASSWORD = "${secret_key}"
+DB_DATA_LOCATION = "/data/${project_name}/database"
+DB_DATABASE = "${project_name}"
+
+# --- PostgreSQL ---
+POSTGRES_PRISMA_URL = "postgresql://${DB_USERNAME}:${DB_PASSWORD}@${project_name}-db:5432/${DB_DATABASE}"
+POSTGRES_URL_NON_POOLING = "postgresql://${DB_USERNAME}:${DB_PASSWORD}@${project_name}-db:5432/${DB_DATABASE}"
\ No newline at end of file
diff --git a/meta.json b/meta.json
index 1c95f983..5c781fdb 100644
--- a/meta.json
+++ b/meta.json
@@ -161,11 +161,28 @@
"self-hosted"
]
},
+ {
+ "id": "alarik",
+ "name": "Alarik",
+ "description": "Alarik is a high-performance, S3-compatible object storage.",
+ "logo": "alarik.png",
+ "version": "latest",
+ "links": {
+ "github": "https://github.com/achtungsoftware/alarik",
+ "website": "https://alarik.io/",
+ "docs": "https://alarik.io/docs"
+ },
+ "tags": [
+ "storage",
+ "s3",
+ "object-storage"
+ ]
+ },
{
"id": "alist",
"name": "AList",
"version": "v3.55.0",
- "description": "🗂️A file list/WebDAV program that supports multiple storages, powered by Gin and Solidjs.",
+ "description": "🗂ï¸A file list/WebDAV program that supports multiple storages, powered by Gin and Solidjs.",
"logo": "alist.svg",
"links": {
"github": "https://github.com/AlistGo/alist",
@@ -299,7 +316,7 @@
"id": "anytype",
"name": "Anytype",
"version": "latest",
- "description": "Anytype is a personal knowledge base—your digital brain—that lets you gather, connect and remix all kinds of information. Create pages, tasks, wikis, journals—even entire apps—and define your own data model while your data stays offline-first, private and encrypted across devices.\n\nAfter installation, you can view the Anytype client configuration by running `cat /data/client-config.yml` inside the service container.",
+ "description": "Anytype is a personal knowledge base—your digital brain—that lets you gather, connect and remix all kinds of information. Create pages, tasks, wikis, journals—even entire apps—and define your own data model while your data stays offline-first, private and encrypted across devices.\n\nAfter installation, you can view the Anytype client configuration by running `cat /data/client-config.yml` inside the service container.",
"logo": "logo.png",
"links": {
"github": "https://github.com/grishy/any-sync-bundle",
@@ -414,6 +431,23 @@
"nosql"
]
},
+ {
+ "id": "archivebox",
+ "name": "ArchiveBox",
+ "version": "latest",
+ "description": "ArchiveBox is a self-hosted internet archiving solution for saving websites, media, and documents.",
+ "logo": "archivebox.svg",
+ "links": {
+ "github": "https://github.com/ArchiveBox/ArchiveBox",
+ "website": "https://archivebox.io/",
+ "docs": "https://docs.archivebox.io/"
+ },
+ "tags": [
+ "archive",
+ "bookmarks",
+ "web"
+ ]
+ },
{
"id": "argilla",
"name": "Argilla",
@@ -511,7 +545,7 @@
"id": "autobase",
"name": "Autobase",
"version": "2.5.2",
- "description": "Autobase for PostgreSQL® is an open-source alternative to cloud-managed databases (self-hosted DBaaS).",
+ "description": "Autobase for PostgreSQL® is an open-source alternative to cloud-managed databases (self-hosted DBaaS).",
"links": {
"github": "https://github.com/vitabaks/autobase",
"website": "https://autobase.tech/",
@@ -721,7 +755,7 @@
"id": "blender",
"name": "Blender",
"version": "latest",
- "description": "Blender is a free and open-source 3D creation suite. It supports the entire 3D pipeline—modeling, rigging, animation, simulation, rendering, compositing and motion tracking, video editing and 2D animation pipeline.",
+ "description": "Blender is a free and open-source 3D creation suite. It supports the entire 3D pipeline—modeling, rigging, animation, simulation, rendering, compositing and motion tracking, video editing and 2D animation pipeline.",
"logo": "blender.svg",
"links": {
"github": "https://github.com/linuxserver/docker-blender",
@@ -1087,6 +1121,24 @@
"Notifications"
]
},
+ {
+ "id": "chatto",
+ "name": "Chatto (single binary)",
+ "version": "0.3.8",
+ "description": "A fully-featured real-time chat application for teams and communities. This template deploys the single Chatto binary with embedded NATS. Note: email/password registration requires SMTP to be configured after deployment; voice/video calls are not included in the single-binary setup.",
+ "logo": "logo.png",
+ "links": {
+ "github": "https://github.com/chattocorp/chatto",
+ "website": "https://chatto.run",
+ "docs": "https://docs.chatto.run"
+ },
+ "tags": [
+ "chat",
+ "communication",
+ "messaging",
+ "self-hosted"
+ ]
+ },
{
"id": "chatwoot",
"name": "Chatwoot",
@@ -1799,6 +1851,23 @@
"discussion"
]
},
+ {
+ "id": "dockge",
+ "name": "Dockge",
+ "version": "1",
+ "description": "Dockge is a reactive, self-hosted Docker Compose stack manager from the creator of Uptime Kuma.",
+ "logo": "dockge.svg",
+ "links": {
+ "github": "https://github.com/louislam/dockge",
+ "website": "https://dockge.kuma.pet/",
+ "docs": "https://github.com/louislam/dockge"
+ },
+ "tags": [
+ "docker",
+ "compose",
+ "management"
+ ]
+ },
{
"id": "docling-serve",
"name": "Docling Serve",
@@ -2292,6 +2361,23 @@
"storage"
]
},
+ {
+ "id": "filegator",
+ "name": "FileGator",
+ "version": "7.14.3",
+ "description": "FileGator is a simple self-hosted web file manager with multi-user support.",
+ "logo": "filegator.svg",
+ "links": {
+ "github": "https://github.com/filegator/filegator",
+ "website": "https://filegator.io/",
+ "docs": "https://docs.filegator.io/"
+ },
+ "tags": [
+ "files",
+ "file-manager",
+ "self-hosted"
+ ]
+ },
{
"id": "filestash",
"name": "Filestash",
@@ -2328,6 +2414,23 @@
"llm"
]
},
+ {
+ "id": "firefly-iii",
+ "name": "Firefly III",
+ "version": "6.6.3",
+ "description": "Firefly III is a self-hosted personal finance manager for tracking expenses, budgets, accounts, and financial reports.",
+ "logo": "logo.svg",
+ "links": {
+ "github": "https://github.com/firefly-iii/firefly-iii",
+ "website": "https://www.firefly-iii.org/",
+ "docs": "https://docs.firefly-iii.org/"
+ },
+ "tags": [
+ "finance",
+ "budgeting",
+ "self-hosted"
+ ]
+ },
{
"id": "fivem",
"name": "FiveM Server",
@@ -2866,6 +2969,23 @@
"tools"
]
},
+ {
+ "id": "gotify",
+ "name": "Gotify",
+ "version": "2.9.1",
+ "description": "Gotify is a simple server for sending and receiving self-hosted push notifications.",
+ "logo": "gotify.svg",
+ "links": {
+ "github": "https://github.com/gotify/server",
+ "website": "https://gotify.net/",
+ "docs": "https://gotify.net/docs/"
+ },
+ "tags": [
+ "notifications",
+ "self-hosted",
+ "push"
+ ]
+ },
{
"id": "grafana",
"name": "Grafana",
@@ -2935,6 +3055,24 @@
"self-hosted"
]
},
+ {
+ "id": "hermes",
+ "name": "Hermes",
+ "version": "v2026.6.19",
+ "description": "Hermes is an open agent runtime from Nous Research, exposing an OpenAI-compatible gateway API and a supervised web dashboard for building and running AI agents.",
+ "logo": "logo.png",
+ "links": {
+ "github": "https://github.com/NousResearch/hermes-agent",
+ "website": "https://hermes-agent.nousresearch.com/",
+ "docs": "https://hermes-agent.nousresearch.com/docs/user-guide/docker"
+ },
+ "tags": [
+ "ai",
+ "agent",
+ "llm",
+ "self-hosted"
+ ]
+ },
{
"id": "heyform",
"name": "HeyForm",
@@ -3085,7 +3223,7 @@
"id": "huly",
"name": "Huly",
"version": "0.6.377",
- "description": "Huly — All-in-One Project Management Platform (alternative to Linear, Jira, Slack, Notion, Motion)",
+ "description": "Huly — All-in-One Project Management Platform (alternative to Linear, Jira, Slack, Notion, Motion)",
"logo": "huly.svg",
"links": {
"github": "https://github.com/hcengineering/huly-selfhost",
@@ -3208,6 +3346,24 @@
"database"
]
},
+ {
+ "id": "inkvoice",
+ "name": "Inkvoice",
+ "version": "0.1.0",
+ "description": "Open-source invoicing for freelancers and small teams: invoices, online payments (Stripe & PayPal), expenses, multi-currency and reports.",
+ "logo": "inkvoice.svg",
+ "links": {
+ "github": "https://github.com/pigontech/inkvoice",
+ "website": "https://inkvoice.app",
+ "docs": "https://docs.inkvoice.app"
+ },
+ "tags": [
+ "invoicing",
+ "billing",
+ "finance",
+ "self-hosted"
+ ]
+ },
{
"id": "inngest",
"name": "Inngest",
@@ -3328,6 +3484,23 @@
"media system"
]
},
+ {
+ "id": "jellyseerr",
+ "name": "Jellyseerr",
+ "version": "2.7.3",
+ "description": "Jellyseerr is a media request and discovery manager for Jellyfin, Plex, and Emby users.",
+ "logo": "jellyseerr.svg",
+ "links": {
+ "github": "https://github.com/Fallenbagel/jellyseerr",
+ "website": "https://docs.jellyseerr.dev/",
+ "docs": "https://docs.jellyseerr.dev/"
+ },
+ "tags": [
+ "media",
+ "requests",
+ "jellyfin"
+ ]
+ },
{
"id": "jenkins",
"name": "jenkins",
@@ -3365,6 +3538,23 @@
"webrtc"
]
},
+ {
+ "id": "joplin-server",
+ "name": "Joplin Server",
+ "version": "3.7.1",
+ "description": "Joplin Server is the self-hosted sync backend for Joplin notes, notebooks, and attachments.",
+ "logo": "joplin-server.svg",
+ "links": {
+ "github": "https://github.com/laurent22/joplin",
+ "website": "https://joplinapp.org/",
+ "docs": "https://github.com/laurent22/joplin/tree/dev/packages/server"
+ },
+ "tags": [
+ "notes",
+ "sync",
+ "productivity"
+ ]
+ },
{
"id": "kaneo",
"name": "Kaneo",
@@ -3609,7 +3799,7 @@
"id": "librechat",
"name": "LibreChat",
"version": "latest",
- "description": "LibreChat is the ultimate open-source app for all your AI conversations, fully customizable and compatible with any AI provider (Openai, Ollama, Google etc.) — all in one sleek interface.",
+ "description": "LibreChat is the ultimate open-source app for all your AI conversations, fully customizable and compatible with any AI provider (Openai, Ollama, Google etc.) — all in one sleek interface.",
"logo": "librechat.png",
"links": {
"github": "https://github.com/danny-avila/librechat",
@@ -4550,6 +4740,24 @@
"academic"
]
},
+ {
+ "id": "ollama-chat-tone",
+ "name": "Ollama Chat Tone",
+ "version": "latest",
+ "description": "Self-contained Ollama chat client with local auth, streaming responses, and per-user conversations.",
+ "logo": "ollama-chat-tone.svg",
+ "links": {
+ "github": "https://github.com/billnice250/ollama-chat-client",
+ "website": "https://hub.docker.com/r/billnice250/chattone",
+ "docs": "https://hub.docker.com/r/billnice250/chattone"
+ },
+ "tags": [
+ "chatbot",
+ "ai",
+ "ollama",
+ "docker"
+ ]
+ },
{
"id": "omni-tools",
"name": "Omni-Tools",
@@ -5018,7 +5226,7 @@
"id": "photoprism",
"name": "Photoprism",
"version": "latest",
- "description": "PhotoPrism® is an AI-Powered Photos App for the Decentralized Web. It makes use of the latest technologies to tag and find pictures automatically without getting in your way.",
+ "description": "PhotoPrism® is an AI-Powered Photos App for the Decentralized Web. It makes use of the latest technologies to tag and find pictures automatically without getting in your way.",
"logo": "photoprism.svg",
"links": {
"github": "https://github.com/photoprism/photoprism",
@@ -5759,6 +5967,23 @@
"file-system"
]
},
+ {
+ "id": "sftpgo",
+ "name": "SFTPGo",
+ "version": "2.7.3",
+ "description": "SFTPGo is a full-featured and highly configurable SFTP, HTTP/S, FTP/S, and WebDAV server.",
+ "logo": "sftpgo.svg",
+ "links": {
+ "github": "https://github.com/drakkan/sftpgo",
+ "website": "https://sftpgo.com/",
+ "docs": "https://docs.sftpgo.com/"
+ },
+ "tags": [
+ "sftp",
+ "files",
+ "webdav"
+ ]
+ },
{
"id": "shlink",
"name": "Shlink",
@@ -5882,6 +6107,23 @@
"storage"
]
},
+ {
+ "id": "spliit",
+ "name": "Spliit",
+ "version": "latest",
+ "description": "Spliit is a lightweight, self-hosted alternative to Auth0 and Clerk. Open-source, cost-effective, and developer-friendly, it provides secure authentication (OAuth, email/password, social logins) with full control over your data. No per-user fees, easy to integrate, and perfect for startups or privacy-focused projects.",
+ "logo": "spliit.png",
+ "links": {
+ "github": "https://github.com/spliit-app/spliit",
+ "website": "https://spliit.app/",
+ "docs": "https://github.com/spliit-app"
+ },
+ "tags": [
+ "budgeting",
+ "finance",
+ "money"
+ ]
+ },
{
"id": "stack-auth",
"name": "Stack Auth",
@@ -6049,7 +6291,7 @@
"id": "surrealdb",
"name": "SurrealDB",
"version": "2.3.10",
- "description": "SurrealDB is a native, open-source, multi-model database that lets you store and manage data across relational, document, graph, time-series, vector & search, and geospatial models—all in one place.",
+ "description": "SurrealDB is a native, open-source, multi-model database that lets you store and manage data across relational, document, graph, time-series, vector & search, and geospatial models—all in one place.",
"logo": "surrealdb.svg",
"links": {
"github": "https://github.com/surrealdb/surrealdb",
@@ -6321,7 +6563,7 @@
"id": "typecho",
"name": "Typecho",
"version": "stable",
- "description": "Typecho 是一个轻量级的开源博客程序,基于 PHP 开发,支持多种数据库,简洁而强大。",
+ "description": "Typecho 是一个轻é‡çº§çš„å¼€æºåšå®¢ç¨‹åºï¼ŒåŸºäºŽ PHP å¼€å‘,支æŒå¤šç§æ•°æ®åº“,简æ´è€Œå¼ºå¤§ã€‚",
"logo": "typecho.png",
"links": {
"github": "https://github.com/typecho/typecho",