diff --git a/blueprints/freshrss/docker-compose.yml b/blueprints/freshrss/docker-compose.yml
new file mode 100644
index 00000000..8965edc4
--- /dev/null
+++ b/blueprints/freshrss/docker-compose.yml
@@ -0,0 +1,30 @@
+services:
+ freshrss:
+ image: freshrss/freshrss:${FRESHRSS_VERSION:-latest}
+ restart: unless-stopped
+ volumes:
+ # FreshRSS persistent data such as configuration and SQLite databases
+ - freshrss_data:/var/www/FreshRSS/data
+ # Optional volume for storing third-party extensions
+ - freshrss_extensions:/var/www/FreshRSS/extensions
+ ports:
+ - "80"
+ environment:
+ # Server timezone
+ TZ: ${TZ:-UTC}
+ # Cron job to refresh feeds at specified minutes
+ CRON_MIN: ${CRON_MIN:-13,43}
+ # Production or development mode
+ FRESHRSS_ENV: ${FRESHRSS_ENV:-production}
+ # Copy logs to syslog
+ COPY_LOG_TO_SYSLOG: ${COPY_LOG_TO_SYSLOG:-On}
+ # Copy syslog to stderr for docker logs
+ COPY_SYSLOG_TO_STDERR: ${COPY_SYSLOG_TO_STDERR:-On}
+ # Optional auto-install parameters
+ FRESHRSS_INSTALL: ${FRESHRSS_INSTALL:-}
+ # Optional auto-create user parameters
+ FRESHRSS_USER: ${FRESHRSS_USER:-}
+
+volumes:
+ freshrss_data:
+ freshrss_extensions:
diff --git a/blueprints/freshrss/freshrss.svg b/blueprints/freshrss/freshrss.svg
new file mode 100644
index 00000000..a3c8bf75
--- /dev/null
+++ b/blueprints/freshrss/freshrss.svg
@@ -0,0 +1,23 @@
+
diff --git a/blueprints/freshrss/template.toml b/blueprints/freshrss/template.toml
new file mode 100644
index 00000000..e4f61942
--- /dev/null
+++ b/blueprints/freshrss/template.toml
@@ -0,0 +1,19 @@
+[variables]
+main_domain = "${domain}"
+timezone = "UTC"
+
+[config.env]
+FRESHRSS_VERSION = "latest"
+TZ = "${timezone}"
+CRON_MIN = "13,43"
+FRESHRSS_ENV = "production"
+COPY_LOG_TO_SYSLOG = "On"
+COPY_SYSLOG_TO_STDERR = "On"
+
+[config]
+mounts = []
+
+[[config.domains]]
+serviceName = "freshrss"
+port = 80
+host = "${main_domain}"
\ No newline at end of file
diff --git a/blueprints/karakeep/docker-compose.yml b/blueprints/karakeep/docker-compose.yml
new file mode 100644
index 00000000..dd79e704
--- /dev/null
+++ b/blueprints/karakeep/docker-compose.yml
@@ -0,0 +1,54 @@
+services:
+ web:
+ image: ghcr.io/karakeep-app/karakeep:${KARAKEEP_VERSION:-release}
+ restart: unless-stopped
+ volumes:
+ # By default, the data is stored in a docker volume called "karakeep_data".
+ # If you want to mount a custom directory, change the volume mapping to:
+ # - /path/to/your/directory:/data
+ - karakeep_data:/data
+ ports:
+ - "3000"
+ environment:
+ DATA_DIR: ${DATA_DIR:-/data}
+ DISABLE_SIGNUPS: ${DISABLE_SIGNUPS:-false}
+ NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
+ NEXTAUTH_URL: ${NEXTAUTH_URL}
+ # Meilisearch config
+ MEILI_ADDR: ${MEILI_ADDR:-http://meilisearch:7700}
+ MEILI_MASTER_KEY: ${MEILI_MASTER_KEY}
+ # Chrome config
+ BROWSER_WEB_URL: ${BROWSER_WEB_URL:-ws://chrome:3000}
+ BROWSER_CONNECT_ONDEMAND: ${BROWSER_CONNECT_ONDEMAND:-true}
+ depends_on:
+ - chrome
+ - meilisearch
+
+ chrome:
+ image: browserless/chrome:1-chrome-stable
+ restart: unless-stopped
+ ports:
+ - "3000"
+ environment:
+ - DEBUG=browserless*
+ - MAX_CONCURRENT_SESSIONS=10
+ - CONNECTION_TIMEOUT=60000
+ - MAX_QUEUE_LENGTH=10
+ - PORT=3000
+ - CHROME_REFRESH_TIME=2147483647
+
+ meilisearch:
+ image: getmeili/meilisearch:v1.10
+ restart: unless-stopped
+ ports:
+ - "7700"
+ environment:
+ MEILI_MASTER_KEY: ${MEILI_MASTER_KEY}
+ MEILI_NO_ANALYTICS: true
+ MEILI_ENV: production
+ volumes:
+ - meilisearch_data:/meili_data
+
+volumes:
+ karakeep_data:
+ meilisearch_data:
diff --git a/blueprints/karakeep/karakeep.svg b/blueprints/karakeep/karakeep.svg
new file mode 100644
index 00000000..caabdbe1
--- /dev/null
+++ b/blueprints/karakeep/karakeep.svg
@@ -0,0 +1,15 @@
+
+
+
diff --git a/blueprints/karakeep/template.toml b/blueprints/karakeep/template.toml
new file mode 100644
index 00000000..751cf8ec
--- /dev/null
+++ b/blueprints/karakeep/template.toml
@@ -0,0 +1,25 @@
+[variables]
+main_domain = "${domain}"
+nextauth_secret = "${password:64}"
+meili_master_key = "${password:32}"
+
+[config.env]
+KARAKEEP_VERSION = "release"
+NEXTAUTH_SECRET = "${nextauth_secret}"
+MEILI_MASTER_KEY = "${meili_master_key}"
+NEXTAUTH_URL = "http://${main_domain}"
+DATA_DIR = "/data"
+DISABLE_SIGNUPS = "false"
+# Meilisearch config
+MEILI_ADDR = "http://meilisearch:7700"
+# Chrome config
+BROWSER_WEB_URL = "ws://chrome:9222"
+BROWSER_CONNECT_ONDEMAND = "true"
+
+[config]
+mounts = []
+
+[[config.domains]]
+serviceName = "web"
+port = 3000
+host = "${main_domain}"
\ No newline at end of file
diff --git a/blueprints/movary/docker-compose.yml b/blueprints/movary/docker-compose.yml
new file mode 100644
index 00000000..f84ff9e5
--- /dev/null
+++ b/blueprints/movary/docker-compose.yml
@@ -0,0 +1,41 @@
+services:
+ movary:
+ image: leepeuker/movary:${MOVARY_VERSION:-latest}
+ restart: unless-stopped
+ ports:
+ - "8080"
+ environment:
+ # TMDB API configuration
+ TMDB_API_KEY: ${TMDB_API_KEY}
+ # Database configuration
+ DATABASE_MODE: "mysql"
+ DATABASE_MYSQL_HOST: "mysql"
+ DATABASE_MYSQL_NAME: "movary"
+ DATABASE_MYSQL_USER: "movary_user"
+ DATABASE_MYSQL_PASSWORD: ${MYSQL_PASSWORD}
+ # Application settings
+ APP_URL: ${APP_URL:-http://localhost:8080}
+ APP_ENV: ${APP_ENV:-production}
+ volumes:
+ - movary_storage:/app/storage
+ depends_on:
+ - mysql
+
+ mysql:
+ image: mysql:${MYSQL_VERSION:-8.0}
+ restart: unless-stopped
+ environment:
+ MYSQL_DATABASE: "movary"
+ MYSQL_USER: "movary_user"
+ MYSQL_PASSWORD: ${MYSQL_PASSWORD}
+ MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
+ # MySQL optimization
+ MYSQL_INNODB_BUFFER_POOL_SIZE: "128M"
+ MYSQL_INNODB_LOG_FILE_SIZE: "64M"
+ volumes:
+ - movary_db:/var/lib/mysql
+ command: --default-authentication-plugin=mysql_native_password
+
+volumes:
+ movary_db:
+ movary_storage:
diff --git a/blueprints/movary/movary.png b/blueprints/movary/movary.png
new file mode 100644
index 00000000..779401a0
Binary files /dev/null and b/blueprints/movary/movary.png differ
diff --git a/blueprints/movary/template.toml b/blueprints/movary/template.toml
new file mode 100644
index 00000000..e2714d9e
--- /dev/null
+++ b/blueprints/movary/template.toml
@@ -0,0 +1,22 @@
+[variables]
+main_domain = "${domain}"
+tmdb_api_key = ""
+mysql_password = "${password:32}"
+mysql_root_password = "${password:32}"
+
+[config.env]
+MOVARY_VERSION = "latest"
+MYSQL_VERSION = "8.0"
+TMDB_API_KEY = "${tmdb_api_key}"
+MYSQL_PASSWORD = "${mysql_password}"
+MYSQL_ROOT_PASSWORD = "${mysql_root_password}"
+APP_URL = "http://${main_domain}"
+APP_ENV = "production"
+
+[config]
+mounts = []
+
+[[config.domains]]
+serviceName = "movary"
+port = 8080
+host = "${main_domain}"
\ No newline at end of file
diff --git a/meta.json b/meta.json
index 6846780f..ed6a0a1f 100644
--- a/meta.json
+++ b/meta.json
@@ -155,7 +155,15 @@
"website": "https://stalw.art/",
"docs": "https://stalw.art/docs/"
},
- "tags": ["email", "smtp", "jmap", "imap4", "pop3", "self-hosted", "mail-server"]
+ "tags": [
+ "email",
+ "smtp",
+ "jmap",
+ "imap4",
+ "pop3",
+ "self-hosted",
+ "mail-server"
+ ]
},
{
"id": "datalens",
@@ -633,14 +641,10 @@
"logo": "typecho.png",
"links": {
"github": "https://github.com/typecho/typecho",
- "website": "https://typecho.org/",
+ "website": "https://typecho.org/",
"docs": "http://docs.typecho.org"
},
- "tags": [
- "blog",
- "cms",
- "php"
- ]
+ "tags": ["blog", "cms", "php"]
},
{
"id": "gitea",
@@ -2508,10 +2512,75 @@
"website": "https://palmr.kyantech.com.br/",
"docs": "https://palmr.kyantech.com.br/docs/3.0-beta"
},
+ "tags": ["file-sharing", "self-hosted", "open-source"]
+ },
+ {
+ "id": "karakeep",
+ "name": "KaraKeep",
+ "version": "0.25.0",
+ "description": "A self-hostable bookmark-everything app (links, notes and images) with AI-based automatic tagging and full text search. Previously known as Hoarder.",
+ "logo": "karakeep.svg",
+ "links": {
+ "github": "https://github.com/karakeep-app/karakeep",
+ "website": "https://karakeep.app/",
+ "docs": "https://github.com/karakeep-app/karakeep/tree/main/docs"
+ },
"tags": [
- "file-sharing",
+ "bookmarks",
+ "bookmark-manager",
"self-hosted",
- "open-source"
+ "ai",
+ "search",
+ "notes",
+ "productivity"
+ ]
+ },
+ {
+ "id": "freshrss",
+ "name": "FreshRSS",
+ "version": "latest",
+ "description": "A free, self-hostable RSS and Atom feed aggregator. Lightweight, easy to work with, powerful, and customizable with themes and extensions.",
+ "logo": "freshrss.svg",
+ "links": {
+ "github": "https://github.com/FreshRSS/FreshRSS",
+ "website": "https://freshrss.org/",
+ "docs": "https://freshrss.github.io/FreshRSS/"
+ },
+ "tags": [
+ "rss",
+ "feed-reader",
+ "news",
+ "self-hosted",
+ "aggregator",
+ "reader"
+ ]
+ },
+ {
+ "id": "movary",
+ "name": "Movary",
+ "version": "0.66.2",
+ "description": "Self-hosted web app to track, rate and explore your movie watch history. Offers detailed statistics, third-party integrations for platforms like Trakt, Letterboxd, Netflix, and automated play tracking for Plex, Jellyfin, Emby or Kodi.",
+ "logo": "movary.png",
+ "links": {
+ "github": "https://github.com/leepeuker/movary",
+ "website": "https://movary.org/",
+ "docs": "https://movary.org/docs/",
+ "demo": "https://demo.movary.org/"
+ },
+ "tags": [
+ "movies",
+ "movie-tracker",
+ "self-hosted",
+ "plex",
+ "jellyfin",
+ "emby",
+ "kodi",
+ "trakt",
+ "letterboxd",
+ "netflix",
+ "tmdb",
+ "statistics",
+ "rating"
]
},
{