diff --git a/public/svgs/grist.svg b/public/svgs/grist.svg
new file mode 100644
index 000000000..82975b768
--- /dev/null
+++ b/public/svgs/grist.svg
@@ -0,0 +1,18 @@
+
+
\ No newline at end of file
diff --git a/public/svgs/orangehrm.svg b/public/svgs/orangehrm.svg
new file mode 100644
index 000000000..b976d57ec
--- /dev/null
+++ b/public/svgs/orangehrm.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/templates/compose/grist.yaml b/templates/compose/grist.yaml
new file mode 100644
index 000000000..272b4fb5d
--- /dev/null
+++ b/templates/compose/grist.yaml
@@ -0,0 +1,90 @@
+# documentation: https://support.getgrist.com/
+# slogan: Grist is a modern relational spreadsheet. It combines the flexibility of a spreadsheet with the robustness of a database. * Requires an OIDC provider set up.
+# tags: lowcode, nocode, spreadsheet, database, relational
+# logo: svgs/grist.svg
+# port: 443
+
+services:
+ grist:
+ image: gristlabs/grist
+ environment:
+ - TZ=${TZ:-UTC}
+ - GRIST_SUPPORT_ANON=${SUPPORT_ANON:-false}
+ - GRIST_FORCE_LOGIN=${FORCE_LOGIN:-true}
+ - COOKIE_MAX_AGE=${COOKIE_MAX_AGE:-86400000}
+ - GRIST_PAGE_TITLE_SUFFIX=${PAGE_TITLE_SUFFIX:- - Suffix}
+ - GRIST_HIDE_UI_ELEMENTS=${HIDE_UI_ELEMENTS:-billing,sendToDrive,supportGrist,multiAccounts,tutorials}
+ - GRIST_UI_FEATURES=${UI_FEATURES:-helpCenter,billing,templates,createSite,multiSite,sendToDrive,tutorials,supportGrist}
+ - SERVICE_FQDN_GRIST=${SERVICE_FQDN_GRIST}
+ - GRIST_DOMAIN=${DOMAIN:-domain.com}
+ - APP_HOME_URL=${SERVICE_FQDN_GRIST}
+ - APP_DOC_URL=${SERVICE_FQDN_GRIST}
+ - GRIST_DEFAULT_EMAIL=${DEFAULT_EMAIL:-super.user@email.com}
+ - GRIST_ORG_IN_PATH=${ORG_IN_PATH:-true}
+ - GRIST_OIDC_SP_HOST=${SERVICE_FQDN_GRIST}
+ - GRIST_OIDC_IDP_SCOPES=${OIDC_IDP_SCOPES:-openid profile email}
+ - GRIST_OIDC_IDP_SKIP_END_SESSION_ENDPOINT=${OIDC_IDP_SKIP_END_SESSION_ENDPOINT:-false}
+ - GRIST_OIDC_IDP_ISSUER=${OIDC_IDP_ISSUER:-https://auth.domain.com/application/o/grist/}
+ - GRIST_OIDC_IDP_CLIENT_ID=${OIDC_IDP_CLIENT_ID:-your-client-id}
+ - GRIST_OIDC_IDP_CLIENT_SECRET=${OIDC_IDP_CLIENT_SECRET:-your-client-secret}
+ - GRIST_SESSION_SECRET=${SESSION_SECRET:-$SERVICE_REALBASE64_128}
+ - GRIST_HOME_INCLUDE_STATIC=${HOME_INCLUDE_STATIC:-true}
+ - GRIST_SANDBOX_FLAVOR=${SANDBOX_FLAVOR:-gvisor}
+ - ALLOWED_WEBHOOK_DOMAINS=${ALLOWED_WEBHOOK_DOMAINS:-n8n.domain.com}
+ - COMMENTS=${COMMENTS:-true}
+ - TYPEORM_TYPE=${TYPEORM_TYPE:-postgres}
+ - TYPEORM_DATABASE=${POSTGRES_DATABASE:-postgres}
+ - TYPEORM_USERNAME=${POSTGRES_USERNAME:-postgres}
+ - TYPEORM_PASSWORD=${POSTGRES_PASSWORD:-$SERVICE_PASSWORD_POSTGRES}
+ - TYPEORM_HOST=${TYPEORM_HOST:-postgres}
+ - TYPEORM_PORT=${TYPEORM_PORT:-5432}
+ - TYPEORM_LOGGING=${TYPEORM_LOGGING:-false}
+ - REDIS_URL=${REDIS_URL:-redis://redis:6379}
+ - GRIST_HELP_CENTER=${HELP_CENTER:-$SERVICE_FQDN_GRIST/help}
+ - GRIST_TERMS_OF_SERVICE_URL=${TERMS_OF_SERVICE_URL:-$SERVICE_FQDN_GRIST/terms}
+ - FREE_COACHING_CALL_URL=${FREE_COACHING_CALL_URL:-super.user@email.com}
+ - GRIST_CONTACT_SUPPORT_URL=${CONTACT_SUPPORT_URL:-super.user@email.com}
+ volumes:
+ - 'grist-data:/persist'
+ depends_on:
+ postgres:
+ condition: service_healthy
+ redis:
+ condition: service_healthy
+ healthcheck:
+ test:
+ - CMD
+ - node
+ - '-e'
+ - "require('http').get('http://localhost:8484/status', res => process.exit(res.statusCode === 200 ? 0 : 1))"
+ - '> /dev/null 2>&1'
+ interval: 5s
+ timeout: 20s
+ retries: 10
+ postgres:
+ image: 'postgres:16'
+ environment:
+ - POSTGRES_DB=${POSTGRES_DATABASE:-postgres}
+ - POSTGRES_USER=${POSTGRES_USERNAME:-postgres}
+ - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-$SERVICE_PASSWORD_POSTGRES}
+ volumes:
+ - 'postgres-data:/var/lib/postgresql/data'
+ healthcheck:
+ test:
+ - CMD-SHELL
+ - 'pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}'
+ interval: 5s
+ timeout: 10s
+ retries: 20
+ redis:
+ image: 'redis:7'
+ volumes:
+ - 'redis-data:/data'
+ healthcheck:
+ test:
+ - CMD
+ - redis-cli
+ - PING
+ interval: 5s
+ timeout: 10s
+ retries: 20
diff --git a/templates/compose/orangehrm.yaml b/templates/compose/orangehrm.yaml
new file mode 100644
index 000000000..f93f229d1
--- /dev/null
+++ b/templates/compose/orangehrm.yaml
@@ -0,0 +1,49 @@
+# documentation: https://starterhelp.orangehrm.com/hc/en-us
+# slogan: Host OrangeHRM on your own infrastructure. This deployment option provides the greatest level of flexibility and control.
+# tags: HR, HRIS, HRMS, human resource management, OrangeHRM, HR management
+# logo: svgs/orangehrm.svg
+# port: 80
+
+services:
+ orangehrm:
+ image: 'orangehrm/orangehrm:latest'
+ platform: linux/amd64
+ environment:
+ - SERVICE_FQDN_ORANGEHRM_80
+ - ORANGEHRM_DATABASE_HOST=mariadb
+ - ORANGEHRM_DATABASE_USER=${SERVICE_USER_ORANGEHRM}
+ - ORANGEHRM_DATABASE_PASSWORD=${SERVICE_PASSWORD_ORANGEHRM}
+ - ORANGEHRM_DATABASE_NAME=${MARIADB_DATABASE:-orangehrm}
+ volumes:
+ - 'orangehrm-data:/orangehrm'
+ depends_on:
+ - mariadb
+ links:
+ - 'mariadb:mariadb'
+ healthcheck:
+ test:
+ - CMD
+ - curl
+ - '-f'
+ - 'http://127.0.0.1'
+ interval: 2s
+ timeout: 10s
+ retries: 10
+ mariadb:
+ image: 'mariadb:10.11'
+ volumes:
+ - 'mariadb-data:/var/lib/mysql'
+ environment:
+ - MARIADB_ROOT_PASSWORD=${SERVICE_PASSWORD_ROOT}
+ - MARIADB_DATABASE=${MARIADB_DATABASE:-orangehrm}
+ - MARIADB_USER=${SERVICE_USER_ORANGEHRM}
+ - MARIADB_PASSWORD=${SERVICE_PASSWORD_ORANGEHRM}
+ healthcheck:
+ test:
+ - CMD
+ - healthcheck.sh
+ - '--connect'
+ - '--innodb_initialized'
+ interval: 5s
+ timeout: 20s
+ retries: 10