diff --git a/blueprints/kavita/docker-compose.yml b/blueprints/kavita/docker-compose.yml
new file mode 100644
index 00000000..cd16cfea
--- /dev/null
+++ b/blueprints/kavita/docker-compose.yml
@@ -0,0 +1,21 @@
+version: "3.8"
+
+services:
+ kavita:
+ image: jvmilazz0/kavita:latest
+ restart: unless-stopped
+ expose:
+ - "5000"
+ environment:
+ - TZ=Etc/UTC
+ volumes:
+ - kavita-config:/kavita/config
+ - kavita-media:/manga
+ - kavita-books:/books
+ - kavita-comics:/comics
+
+volumes:
+ kavita-config:
+ kavita-media:
+ kavita-books:
+ kavita-comics:
diff --git a/blueprints/kavita/kavita.svg b/blueprints/kavita/kavita.svg
new file mode 100644
index 00000000..d2940227
--- /dev/null
+++ b/blueprints/kavita/kavita.svg
@@ -0,0 +1 @@
+
diff --git a/blueprints/kavita/template.toml b/blueprints/kavita/template.toml
new file mode 100644
index 00000000..b7c88ea0
--- /dev/null
+++ b/blueprints/kavita/template.toml
@@ -0,0 +1,5 @@
+[config]
+[[config.domains]]
+serviceName = "kavita"
+port = 5000
+host = "${domain}"
diff --git a/blueprints/miniflux/docker-compose.yml b/blueprints/miniflux/docker-compose.yml
new file mode 100644
index 00000000..6ec4135d
--- /dev/null
+++ b/blueprints/miniflux/docker-compose.yml
@@ -0,0 +1,35 @@
+version: "3.8"
+
+services:
+ miniflux:
+ image: miniflux/miniflux:latest
+ restart: unless-stopped
+ expose:
+ - "8080"
+ depends_on:
+ miniflux-db:
+ condition: service_healthy
+ environment:
+ - DATABASE_URL=postgres://miniflux:${MINIFLUX_DB_PASSWORD}@miniflux-db/miniflux?sslmode=disable
+ - RUN_MIGRATIONS=1
+ - CREATE_ADMIN=1
+ - ADMIN_USERNAME=${MINIFLUX_ADMIN_USERNAME}
+ - ADMIN_PASSWORD=${MINIFLUX_ADMIN_PASSWORD}
+
+ miniflux-db:
+ image: postgres:17-alpine
+ restart: unless-stopped
+ environment:
+ - POSTGRES_USER=miniflux
+ - POSTGRES_PASSWORD=${MINIFLUX_DB_PASSWORD}
+ - POSTGRES_DB=miniflux
+ volumes:
+ - miniflux-db-data:/var/lib/postgresql/data
+ healthcheck:
+ test: ["CMD", "pg_isready", "-U", "miniflux"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+volumes:
+ miniflux-db-data:
diff --git a/blueprints/miniflux/miniflux.svg b/blueprints/miniflux/miniflux.svg
new file mode 100644
index 00000000..5f4ec6f5
--- /dev/null
+++ b/blueprints/miniflux/miniflux.svg
@@ -0,0 +1 @@
+
diff --git a/blueprints/miniflux/template.toml b/blueprints/miniflux/template.toml
new file mode 100644
index 00000000..48291e85
--- /dev/null
+++ b/blueprints/miniflux/template.toml
@@ -0,0 +1,15 @@
+[variables]
+admin_username = "admin"
+admin_password = "${password}"
+db_password = "${password}"
+
+[config]
+[[config.domains]]
+serviceName = "miniflux"
+port = 8080
+host = "${domain}"
+
+[config.env]
+MINIFLUX_ADMIN_USERNAME = "${admin_username}"
+MINIFLUX_ADMIN_PASSWORD = "${admin_password}"
+MINIFLUX_DB_PASSWORD = "${db_password}"
diff --git a/blueprints/paperless-ngx/docker-compose.yml b/blueprints/paperless-ngx/docker-compose.yml
new file mode 100644
index 00000000..fd010a82
--- /dev/null
+++ b/blueprints/paperless-ngx/docker-compose.yml
@@ -0,0 +1,58 @@
+version: "3.8"
+
+services:
+ paperless-ngx:
+ image: ghcr.io/paperless-ngx/paperless-ngx:latest
+ restart: unless-stopped
+ expose:
+ - "8000"
+ depends_on:
+ paperless-db:
+ condition: service_healthy
+ paperless-redis:
+ condition: service_started
+ environment:
+ - PAPERLESS_REDIS=redis://paperless-redis:6379
+ - PAPERLESS_DBHOST=paperless-db
+ - PAPERLESS_DBNAME=paperless
+ - PAPERLESS_DBUSER=paperless
+ - PAPERLESS_DBPASS=${PAPERLESS_DB_PASSWORD}
+ - PAPERLESS_SECRET_KEY=${PAPERLESS_SECRET_KEY}
+ - PAPERLESS_URL=https://${PAPERLESS_DOMAIN}
+ - PAPERLESS_TIME_ZONE=${PAPERLESS_TIME_ZONE}
+ - PAPERLESS_ADMIN_USER=${PAPERLESS_ADMIN_USER}
+ - PAPERLESS_ADMIN_PASSWORD=${PAPERLESS_ADMIN_PASSWORD}
+ volumes:
+ - paperless-data:/usr/src/paperless/data
+ - paperless-media:/usr/src/paperless/media
+ - paperless-export:/usr/src/paperless/export
+ - paperless-consume:/usr/src/paperless/consume
+
+ paperless-db:
+ image: postgres:17-alpine
+ restart: unless-stopped
+ environment:
+ - POSTGRES_DB=paperless
+ - POSTGRES_USER=paperless
+ - POSTGRES_PASSWORD=${PAPERLESS_DB_PASSWORD}
+ volumes:
+ - paperless-db-data:/var/lib/postgresql/data
+ healthcheck:
+ test: ["CMD", "pg_isready", "-U", "paperless"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ paperless-redis:
+ image: redis:7-alpine
+ restart: unless-stopped
+ volumes:
+ - paperless-redis-data:/data
+
+volumes:
+ paperless-data:
+ paperless-media:
+ paperless-export:
+ paperless-consume:
+ paperless-db-data:
+ paperless-redis-data:
diff --git a/blueprints/paperless-ngx/paperless-ngx.svg b/blueprints/paperless-ngx/paperless-ngx.svg
new file mode 100644
index 00000000..2e571364
--- /dev/null
+++ b/blueprints/paperless-ngx/paperless-ngx.svg
@@ -0,0 +1 @@
+
diff --git a/blueprints/paperless-ngx/template.toml b/blueprints/paperless-ngx/template.toml
new file mode 100644
index 00000000..d02973ac
--- /dev/null
+++ b/blueprints/paperless-ngx/template.toml
@@ -0,0 +1,21 @@
+[variables]
+main_domain = "${domain}"
+admin_user = "admin"
+admin_password = "${password}"
+db_password = "${password}"
+secret_key = "${base64:48}"
+timezone = "Etc/UTC"
+
+[config]
+[[config.domains]]
+serviceName = "paperless-ngx"
+port = 8000
+host = "${main_domain}"
+
+[config.env]
+PAPERLESS_DOMAIN = "${main_domain}"
+PAPERLESS_ADMIN_USER = "${admin_user}"
+PAPERLESS_ADMIN_PASSWORD = "${admin_password}"
+PAPERLESS_DB_PASSWORD = "${db_password}"
+PAPERLESS_SECRET_KEY = "${secret_key}"
+PAPERLESS_TIME_ZONE = "${timezone}"
diff --git a/meta.json b/meta.json
index b5d4c2a5..8fb6356b 100644
--- a/meta.json
+++ b/meta.json
@@ -3455,6 +3455,24 @@
"productivity"
]
},
+ {
+ "id": "kavita",
+ "name": "Kavita",
+ "version": "latest",
+ "description": "Kavita is a self-hosted digital library server for reading manga, comics, and ebooks from any device.",
+ "logo": "kavita.svg",
+ "links": {
+ "github": "https://github.com/Kareadita/Kavita",
+ "website": "https://www.kavitareader.com/",
+ "docs": "https://wiki.kavitareader.com/installation/docker/"
+ },
+ "tags": [
+ "media",
+ "ebooks",
+ "comics",
+ "library"
+ ]
+ },
{
"id": "kener",
"name": "Kener",
@@ -4176,6 +4194,24 @@
"docker"
]
},
+ {
+ "id": "miniflux",
+ "name": "Miniflux",
+ "version": "latest",
+ "description": "Miniflux is a minimalist and opinionated feed reader built for self-hosted RSS and Atom subscriptions.",
+ "logo": "miniflux.svg",
+ "links": {
+ "github": "https://github.com/miniflux/v2",
+ "website": "https://miniflux.app/",
+ "docs": "https://miniflux.app/docs/docker.html"
+ },
+ "tags": [
+ "rss",
+ "feed-reader",
+ "news",
+ "self-hosted"
+ ]
+ },
{
"id": "minio",
"name": "Minio",
@@ -4960,6 +4996,24 @@
"open-source"
]
},
+ {
+ "id": "paperless-ngx",
+ "name": "Paperless-ngx",
+ "version": "latest",
+ "description": "Paperless-ngx is a self-hosted document management system that indexes, archives, and organizes scanned documents.",
+ "logo": "paperless-ngx.svg",
+ "links": {
+ "github": "https://github.com/paperless-ngx/paperless-ngx",
+ "website": "https://paperless-ngx.com/",
+ "docs": "https://docs.paperless-ngx.com/setup/"
+ },
+ "tags": [
+ "documents",
+ "ocr",
+ "archive",
+ "productivity"
+ ]
+ },
{
"id": "parseable",
"name": "Parseable",