From 32e54beda1f7063c18352453df8f52a90cd87a15 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jainil=20Prajapati=20=F0=9F=AA=90?=
<86187588+enough-jainil@users.noreply.github.com>
Date: Wed, 25 Jun 2025 09:29:20 +0530
Subject: [PATCH] =?UTF-8?q?Enhance=20meta.json:=20format=20tag=20lists=20f?=
=?UTF-8?q?or=20consistency,=20add=20new=20entries=20=E2=80=A6=20(#194)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Enhance meta.json: format tag lists for consistency, add new entries for KaraKeep, FreshRSS, and Movary with detailed descriptions and links.
* Update blueprints/freshrss/docker-compose.yml
* Update blueprints/karakeep/docker-compose.yml
* Update blueprints/karakeep/docker-compose.yml
* Update blueprints/karakeep/docker-compose.yml
* Update blueprints/karakeep/docker-compose.yml
* Update blueprints/movary/docker-compose.yml
---------
Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
---
blueprints/freshrss/docker-compose.yml | 30 +++++++++
blueprints/freshrss/freshrss.svg | 23 +++++++
blueprints/freshrss/template.toml | 19 ++++++
blueprints/karakeep/docker-compose.yml | 54 +++++++++++++++
blueprints/karakeep/karakeep.svg | 15 +++++
blueprints/karakeep/template.toml | 25 +++++++
blueprints/movary/docker-compose.yml | 41 ++++++++++++
blueprints/movary/movary.png | Bin 0 -> 5649 bytes
blueprints/movary/template.toml | 22 +++++++
meta.json | 87 ++++++++++++++++++++++---
10 files changed, 307 insertions(+), 9 deletions(-)
create mode 100644 blueprints/freshrss/docker-compose.yml
create mode 100644 blueprints/freshrss/freshrss.svg
create mode 100644 blueprints/freshrss/template.toml
create mode 100644 blueprints/karakeep/docker-compose.yml
create mode 100644 blueprints/karakeep/karakeep.svg
create mode 100644 blueprints/karakeep/template.toml
create mode 100644 blueprints/movary/docker-compose.yml
create mode 100644 blueprints/movary/movary.png
create mode 100644 blueprints/movary/template.toml
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 0000000000000000000000000000000000000000..779401a0c6581d32348990f576885a6229065048
GIT binary patch
literal 5649
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
literal 0
HcmV?d00001
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"
]
},
{