Compare commits

..
Author SHA1 Message Date
dosubot[bot]andGitHub 92020b2e2d docs: Dosu updates for PR #730 2026-03-05 07:39:36 +00:00
13 changed files with 9 additions and 545 deletions
+7 -4
View File
@@ -18,13 +18,13 @@ The "why": Enables rapid, standardized deployment of 200+ OSS apps on Dokploy wi
- `meta.json`: Array of template objects. Always process after edits using `node dedupe-and-sort-meta.js` to remove duplicates (by `id`) and sort alphabetically.
- `blueprints/<service>/`:
- `docker-compose.yml`: Standard Docker Compose v3.8. Avoid `ports`, `container_name`, `networks`—Dokploy handles isolation via internal networks.
- `docker-compose.yml`: Standard Docker Compose v3.8. **NEVER use `ports` with host port mappings**—use `expose` only. Avoid `container_name`, `networks`—Dokploy handles isolation via internal networks.
- `template.toml`: Defines variables (e.g., `${domain}`), domains (service:port → host), env vars, and mounts. Use helpers like `${password:32}`, `${uuid}`, `${jwt:secret_var}`.
- `logo.svg/png`: Service icon, referenced in `meta.json`.
- `dedupe-and-sort-meta.js`: Standalone script—reads `meta.json`, removes duplicate `id`s (keeps first), sorts by `id` (case-insensitive), creates timestamped backup.
- `build-scripts/process-meta.js`: Advanced processor with CLI options (`--verbose`, `--no-backup`, `--input`/`--output`), JSON schema validation (required: `id`, `name`, `version`, `description`, `links.github`, `logo`, `tags` array).
Exemplary blueprint: `blueprints/ghost/`—`docker-compose.yml` exposes port 2368; `template.toml` maps domain to Ghost service; meta entry tags as ["blogging", "cms"].
Exemplary blueprint: `blueprints/ghost/`—`docker-compose.yml` uses `expose: ["2368"]` for port exposure; `template.toml` maps domain to Ghost service; meta entry tags as ["blogging", "cms"].
## Development Workflow
@@ -33,7 +33,7 @@ Exemplary blueprint: `blueprints/ghost/`—`docker-compose.yml` exposes port 236
- **REQUIREMENT**: Service **MUST** be open source. Only add templates for applications with an open-source license (e.g., MIT, Apache, GPL, AGPL). Proprietary or closed-source services are not allowed.
- **Verify Docker Images**: Before using any Docker image in `docker-compose.yml`, verify it exists using `docker manifest inspect <image:tag>` (e.g., `docker manifest inspect docker.io/bitnami/discourse:3.5.0`). This ensures the image is available and prevents deployment failures.
- Create `blueprints/<id>/` (e.g., `ghost`).
- Implement `docker-compose.yml` (single service typical; use volumes for persistence).
- Implement `docker-compose.yml` (single service typical; use `expose` for ports, volumes for persistence).
- Configure `template.toml`—reference vars in `[config.domains]`, `[config.env]`, `[config.mounts]`.
- Add/update `meta.json` entry with exact `id` matching folder.
- Run `node dedupe-and-sort-meta.js --backup` to validate/sort.
@@ -49,7 +49,10 @@ No tests in repo—focus on manual validation via scripts and Dokploy deploys. D
- **Open Source Requirement**: **ALL services MUST be open source**. Only applications with open-source licenses (MIT, Apache, GPL, AGPL, etc.) are allowed. Proprietary or closed-source services are strictly prohibited.
- **Template IDs**: Lowercase, kebab-case (e.g., `active-pieces`); unique across repo—enforced by dedupe script.
- **Docker Compose**: Minimal—omit `ports` (Dokploy proxies), persistent volumes (e.g., `- db-data:/var/lib/postgresql/data`). Services named after folder (e.g., `ghost` service).
- **Docker Compose**:
- **Port Mappings**: **NEVER use `ports` with host port mappings** (e.g., `"8080:8080"`)—**always use `expose` only** (e.g., `expose: ["8080"]`). Dokploy handles port proxying via its internal reverse proxy, so host port bindings are unnecessary and create potential port conflicts. This applies to ALL blueprints; some older templates may still incorrectly use `ports` and should be updated to use `expose` instead.
- Use persistent volumes for data storage (e.g., `- db-data:/var/lib/postgresql/data`).
- Services named after folder (e.g., `ghost` service).
- **template.toml**:
- Variables: `[variables] main_domain = "${domain}"`; use helpers for secrets (`${password:64}`, `${base64:32}`).
- Domains: `[[config.domains]] serviceName = "<service>" port = 80 host = "${main_domain}"` (path="/" optional).
-1
View File
@@ -1,7 +1,6 @@
variables = {}
[config]
isolated = false
domains = []
mounts = []
+1 -1
View File
@@ -1,7 +1,7 @@
version: "3.8"
services:
grafana:
image: grafana/grafana-enterprise:12.4
image: grafana/grafana-enterprise:9.5.20
restart: unless-stopped
volumes:
- grafana-storage:/var/lib/grafana
-35
View File
@@ -1,35 +0,0 @@
services:
moltbot-gateway:
image: ghcr.io/moltbot/clawdbot:2026.1.24-1
environment:
HOME: /home/node
TERM: xterm-256color
CLAWDBOT_GATEWAY_TOKEN: ${CLAWDBOT_GATEWAY_TOKEN}
CLAUDE_AI_SESSION_KEY: ${CLAUDE_AI_SESSION_KEY}
CLAUDE_WEB_SESSION_KEY: ${CLAUDE_WEB_SESSION_KEY}
CLAUDE_WEB_COOKIE: ${CLAUDE_WEB_COOKIE}
CLAWDBOT_GATEWAY_URL: ws://0.0.0.0:18789
OPENROUTER_API_KEY: ${OPENROUTER_API_KEY}
volumes:
- moltbot-config:/home/node/.clawdbot
- moltbot-workspace:/home/node/clawd
ports:
- "18789"
- "18790"
init: true
restart: unless-stopped
command:
[
"node",
"dist/index.js",
"gateway",
"--bind",
"auto",
"--port",
"18789",
"--allow-unconfigured"
]
volumes:
moltbot-config:
moltbot-workspace:
-60
View File
@@ -1,60 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16 16" role="img" aria-label="Pixel lobster">
<rect width="16" height="16" fill="none"/>
<!-- outline -->
<g fill="#3a0a0d">
<rect x="1" y="5" width="1" height="3"/>
<rect x="2" y="4" width="1" height="1"/>
<rect x="2" y="8" width="1" height="1"/>
<rect x="3" y="3" width="1" height="1"/>
<rect x="3" y="9" width="1" height="1"/>
<rect x="4" y="2" width="1" height="1"/>
<rect x="4" y="10" width="1" height="1"/>
<rect x="5" y="2" width="6" height="1"/>
<rect x="11" y="2" width="1" height="1"/>
<rect x="12" y="3" width="1" height="1"/>
<rect x="12" y="9" width="1" height="1"/>
<rect x="13" y="4" width="1" height="1"/>
<rect x="13" y="8" width="1" height="1"/>
<rect x="14" y="5" width="1" height="3"/>
<rect x="5" y="11" width="6" height="1"/>
<rect x="4" y="12" width="1" height="1"/>
<rect x="11" y="12" width="1" height="1"/>
<rect x="3" y="13" width="1" height="1"/>
<rect x="12" y="13" width="1" height="1"/>
<rect x="5" y="14" width="6" height="1"/>
</g>
<!-- body -->
<g fill="#ff4f40">
<rect x="5" y="3" width="6" height="1"/>
<rect x="4" y="4" width="8" height="1"/>
<rect x="3" y="5" width="10" height="1"/>
<rect x="3" y="6" width="10" height="1"/>
<rect x="3" y="7" width="10" height="1"/>
<rect x="4" y="8" width="8" height="1"/>
<rect x="5" y="9" width="6" height="1"/>
<rect x="5" y="12" width="6" height="1"/>
<rect x="6" y="13" width="4" height="1"/>
</g>
<!-- claws -->
<g fill="#ff775f">
<rect x="1" y="6" width="2" height="1"/>
<rect x="2" y="5" width="1" height="1"/>
<rect x="2" y="7" width="1" height="1"/>
<rect x="13" y="6" width="2" height="1"/>
<rect x="13" y="5" width="1" height="1"/>
<rect x="13" y="7" width="1" height="1"/>
</g>
<!-- eyes -->
<g fill="#081016">
<rect x="6" y="5" width="1" height="1"/>
<rect x="9" y="5" width="1" height="1"/>
</g>
<g fill="#f5fbff">
<rect x="6" y="4" width="1" height="1"/>
<rect x="9" y="4" width="1" height="1"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

-18
View File
@@ -1,18 +0,0 @@
[variables]
gateway_token = "${password:32}"
[config]
[[config.domains]]
serviceName = "moltbot-gateway"
port = 18789
host = "${domain}"
[config.env]
CLAWDBOT_GATEWAY_TOKEN = "${gateway_token}"
CLAWDBOT_GATEWAY_PORT = 18789
CLAWDBOT_BRIDGE_PORT = 18790
CLAWDBOT_GATEWAY_BIND="lan"
CLAWDBOT_PLUGINS="discord,memory-core"
# Get here https://openrouter.ai/
OPENROUTER_API_KEY="YOUR-API-KEY"
-18
View File
@@ -1,18 +0,0 @@
version: "3.8"
services:
tuwunel:
image: ghcr.io/matrix-construct/tuwunel:v1.5.0
restart: always
environment:
- TUWUNEL_SERVER_NAME=${TUWUNEL_SERVER_NAME:-matrix.local}
- TUWUNEL_ALLOW_REGISTRATION=${TUWUNEL_ALLOW_REGISTRATION:-false}
- TUWUNEL_REGISTRATION_TOKEN=${TUWUNEL_REGISTRATION_TOKEN}
- TUWUNEL_ADDRESS=${TUWUNEL_ADDRESS:-0.0.0.0}
- TUWUNEL_PORT=${TUWUNEL_PORT:-6167}
volumes:
- tuwunel-data:/var/lib/tuwunel/
expose:
- 6167
volumes:
tuwunel-data:
-15
View File
@@ -1,15 +0,0 @@
[variables]
main_domain = "${domain}"
registration_token = "${password:32}"
[config]
env = [
"TUWUNEL_SERVER_NAME=${main_domain}",
"TUWUNEL_REGISTRATION_TOKEN=${registration_token}"
]
mounts = []
[[config.domains]]
serviceName = "tuwunel"
port = 6167
host = "${main_domain}"
-4
View File
@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<rect width="100" height="100" rx="20" fill="#8a2be2"/>
<text x="50" y="65" font-size="50" text-anchor="middle" fill="white" font-family="Arial, sans-serif">T</text>
</svg>

Before

Width:  |  Height:  |  Size: 240 B

-17
View File
@@ -1,17 +0,0 @@
version: "3.8"
services:
verdaccio:
image: verdaccio/verdaccio:6
environment:
- VERDACCIO_PORT=4873
ports:
- 4873
volumes:
- verdaccio_storage:/verdaccio/storage
- verdaccio_plugins:/verdaccio/plugins
- ../files/conf:/verdaccio/conf
volumes:
verdaccio_storage:
verdaccio_plugins:
-259
View File
@@ -1,259 +0,0 @@
[variables]
main_domain = "${domain}"
[config]
[[config.domains]]
serviceName = "verdaccio"
port = 4873
host = "${main_domain}"
[[config.mounts]]
filePath = "/conf/config.yaml"
content = """
#
# This is the default configuration file. It allows all users to do anything,
# please read carefully the documentation and best practices to
# improve security.
#
# Look here for more config file examples:
# https://github.com/verdaccio/verdaccio/blob/master/docker-examples/README.md
#
# Read about the best practices
# https://verdaccio.org/docs/best
# Path to a directory with all packages
storage: /verdaccio/storage/data
# Path to a directory with plugins to include, the plugins folder has the higher priority for loading plugins
# Disable this folder to avoid warnings if is not used
plugins: /verdaccio/plugins
# Web UI settings
# https://verdaccio.org/docs/webui
web:
title: Verdaccio
# Disable complete web UI
# enabled: false
# Custom colors for header background and font
# primaryColor: "#4b5e40"
# Custom logos and favicon
# logo: ./path/to/logo.png
# logoDark: ./path/to/logoDark.png
# favicon: ./path/to/favicon.ico
# Disable gravatar support
# gravatar: false
# By default, packages are ordered ascending
# sort_packages: asc | desc
# Convert your UI to the dark side
# darkMode: true
# html_cache: true
# By default, all features are displayed
# login: true
# showInfo: true
# showSettings: true
# In combination with darkMode you can force specific theme
# showThemeSwitch: true
# showFooter: true
# showSearch: true
# showRaw: true
# showDownloadTarball: true
# showUplinks: true
#
# HTML tags injected before ends </head>
# metaScripts:
# - '<script type="text/javascript" src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>'
# - '<script type="text/javascript" src="https://browser.sentry-cdn.com/5.15.5/bundle.min.js"></script>'
# - '<meta name="robots" content="noindex">'
#
# HTML tags injected as first child in <body>
# scriptsBodyBefore:
# - '<div id="myId">html before webpack scripts</div>'
#
# HTML tags injected as last child in </body>
# scriptsBodyAfter:
# - '<script type="text/javascript" src="https://my.company.com/customJS.min.js"></script>'
#
# Public path for template manifest scripts (only manifest)
# publicPath: http://somedomain.org/
# Settings for authentication plugin
# https://verdaccio.org/docs/configuration#authentication
auth:
htpasswd:
file: /verdaccio/storage/htpasswd
# Maximum amount of users allowed to register, defaults to "+inf".
# You can set this to -1 to disable registration.
max_users: 1
# A list of other known repositories we can talk to
# https://verdaccio.org/docs/configuration#uplinks
uplinks:
npmjs:
url: https://registry.npmjs.org/
# Learn how to protect your packages
# https://verdaccio.org/docs/protect-your-dependencies/
# https://verdaccio.org/docs/configuration#packages
packages:
'@*/*':
# scoped packages
access: $all
publish: $authenticated
unpublish: $authenticated
proxy: npmjs
'**':
# allow all users (including non-authenticated users) to read and
# publish all packages
#
# you can specify usernames/groupnames (depending on your auth plugin)
# and three keywords: "$all", "$anonymous", "$authenticated"
access: $all
# allow all known users to publish/unpublish packages
# (anyone can register by default, remember?)
publish: $authenticated
unpublish: $authenticated
# if package is not available locally, proxy requests to 'npmjs' registry
proxy: npmjs
# To improve your security configuration and avoid dependency confusion
# consider removing the proxy property for private packages
# https://verdaccio.org/docs/best#remove-proxy-to-increase-security-at-private-packages
# https://verdaccio.org/docs/configuration#server
# You can specify HTTP/1.1 server keep alive timeout in seconds for incoming connections.
# A value of 0 makes the http server behave similarly to Node.js versions prior to 8.0.0, which did not have a keep-alive timeout.
# WORKAROUND: Through given configuration you can workaround following issue https://github.com/verdaccio/verdaccio/issues/301. Set to 0 in case 60 is not enough.
server:
keepAliveTimeout: 60
# The pluginPrefix replaces the default plugins prefix which is `verdaccio`. Please don't include `-`. If `something` is provided
# the resolved package will be `something-xxxx`.
# pluginPrefix: something
# A regex for the password validation /.{3}$/ (3 characters min)
# An example to limit to 10 characters minimum
# passwordValidationRegex: /.{10}$/
# Allow `req.ip` to resolve properly when Verdaccio is behind a proxy or load-balancer
# https://expressjs.com/en/guide/behind-proxies.html
# trustProxy: '127.0.0.1'
# https://verdaccio.org/docs/configuration#offline-publish
# publish:
# allow_offline: false
# check_owners: false
# keep_readmes: 'latest' | 'tagged' | 'all'
# Define public URL of registry in combination with VERDACCIO_PUBLIC_URL environment variable
# https://verdaccio.org/docs/configuration#url-prefix
# url_prefix: /verdaccio/
#
# Examples:
# VERDACCIO_PUBLIC_URL='https://somedomain.org'
# url_prefix: '/my_prefix'
# // url -> https://somedomain.org/my_prefix/
#
# VERDACCIO_PUBLIC_URL='https://somedomain.org'
# url_prefix: '/'
# // url -> https://somedomain.org/
#
# VERDACCIO_PUBLIC_URL='https://somedomain.org/first_prefix'
# url_prefix: '/second_prefix'
# // url -> https://somedomain.org/second_prefix/
# Security settings
# https://verdaccio.org/docs/configuration#security
# security:
# api:
# legacy: true
# jwt:
# sign:
# expiresIn: 29d
# verify:
# someProp: [value]
# web:
# sign:
# expiresIn: 1h # 1 hour by default
# verify:
# someProp: [value]
# https://verdaccio.org/docs/configuration#user-rate-limit
# userRateLimit:
# windowMs: 50000
# max: 1000
# https://verdaccio.org/docs/configuration#max-body-size
# max_body_size: 10mb
# https://verdaccio.org/docs/configuration#listen-port
# listen:
# - localhost:4873 # default value
# - http://localhost:4873 # same thing
# - 0.0.0.0:4873 # listen on all addresses (INADDR_ANY)
# - https://example.org:4873 # if you want to use https
# - "[::1]:4873" # ipv6
# - unix:/tmp/verdaccio.sock # unix socket
# The HTTPS configuration is useful if you do not consider use a HTTP Proxy
# https://verdaccio.org/docs/configuration#https
# https:
# key: ./path/verdaccio-key.pem
# cert: ./path/verdaccio-cert.pem
# ca: ./path/verdaccio-csr.pem
# https://verdaccio.org/docs/configuration#proxy
# http_proxy: http://something.local/
# https_proxy: https://something.local/
# no_proxy: localhost,127.0.0.1,server.local
# https://verdaccio.org/docs/configuration#notifications
# notify:
# method: 'POST'
# headers: '[{ "Content-Type": "application/json" }]'
# endpoint: 'https://usagge.hipchat.com/v2/room/3729485/notification?auth_token=mySecretToken'
# content: '{"color":"green","message":"New package published: * {{ name }}*","notify":true,"message_format":"text"}'
# Settings for middleware plugins
# https://verdaccio.org/docs/plugins#middleware-configuration
middlewares:
audit:
enabled: true
# timeout: 10000
# Log settings
# https://verdaccio.org/docs/logger
# Redaction: https://getpino.io/#/docs/redaction
# Synchronous logging: https://getpino.io/#/docs/asynchronous
log:
type: stdout
format: pretty
level: http
# redact:
# paths: ['req.header.authorization','req.header.cookie','req.remoteAddress','req.remotePort','ip','remoteIP','user','msg']
# censor: '<redacted>'
# sync: true
# Feature flags (experimental settings that can be changed or removed in the future)
# https://verdaccio.org/docs/configuration#experiments
# experiments:
# # Support for npm token command
# token: false
# # Enable tarball URL redirect for hosting tarball with a different server.
# # The tarball_url_redirect can be a template string
# tarball_url_redirect: 'https://mycdn.com/verdaccio/${packageName}/${filename}'
# # The tarball_url_redirect can be a function, takes packageName and filename and returns the url,
# # when working with a js configuration file
# tarball_url_redirect(packageName, filename) {
# const signedUrl = // generate a signed url
# return signedUrl;
# }
# Renamed from "experiments" to "flags" in next major release
# flags:
# changePassword: true
# searchRemote: true
# Translate your registry, API and web UI
# List of the available translations https://github.com/verdaccio/verdaccio/blob/master/packages/plugins/ui-theme/src/i18n/ABOUT_TRANSLATIONS.md
i18n:
web: en-US
"""
-38
View File
@@ -1,38 +0,0 @@
<svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="100" height="100" rx="37" fill="white"/>
<g filter="url(#filter0_d_0_18)">
<mask id="path-2-inside-1_0_18" fill="white">
<path fill-rule="evenodd" clip-rule="evenodd" d="M69 46.6L53.8 77H45L21.4 29.8L36.6 29.8L49.4 55.4L53.8 46.6H69Z"/>
</mask>
<path fill-rule="evenodd" clip-rule="evenodd" d="M69 46.6L53.8 77H45L21.4 29.8L36.6 29.8L49.4 55.4L53.8 46.6H69Z" fill="#005EB8"/>
<path d="M69 46.6L71.1466 47.6733L72.8833 44.2H69V46.6ZM53.8 77V79.4H55.2833L55.9466 78.0733L53.8 77ZM45 77L42.8534 78.0733L43.5167 79.4H45V77ZM21.4 29.8V27.4H17.5167L19.2534 30.8733L21.4 29.8ZM36.6 29.8L38.7466 28.7267L38.0833 27.4H36.6V29.8ZM49.4 55.4L47.2534 56.4733L49.4 60.7666L51.5466 56.4733L49.4 55.4ZM53.8 46.6V44.2H52.3167L51.6534 45.5267L53.8 46.6ZM66.8534 45.5267L51.6534 75.9267L55.9466 78.0733L71.1466 47.6733L66.8534 45.5267ZM53.8 74.6H45V79.4H53.8V74.6ZM47.1466 75.9267L23.5466 28.7267L19.2534 30.8733L42.8534 78.0733L47.1466 75.9267ZM21.4 32.2L36.6 32.2V27.4L21.4 27.4V32.2ZM34.4534 30.8733L47.2534 56.4733L51.5466 54.3267L38.7466 28.7267L34.4534 30.8733ZM51.5466 56.4733L55.9466 47.6733L51.6534 45.5267L47.2534 54.3267L51.5466 56.4733ZM53.8 49H69V44.2H53.8V49Z" fill="#005EB8" mask="url(#path-2-inside-1_0_18)"/>
</g>
<g filter="url(#filter1_d_0_18)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M71.8 41H56.6L62.2 29.8L77.4 29.8L71.8 41V41Z" fill="#005EB8"/>
<path d="M62.9416 31H75.4584L71.0584 39.8H58.5416L62.9416 31Z" stroke="#005EB8" stroke-width="2.4"/>
</g>
<path d="M55.6351 70.688L53.0607 75.8H45.7416L23.3416 31H35.8573L55.6351 70.688Z" fill="#FFD101" stroke="#FFD101" stroke-width="2.4"/>
<path d="M58.6 31H73.821" stroke="#005EB8" stroke-width="2.4" stroke-linecap="square"/>
<path d="M54.6 35H69.821" stroke="#005EB8" stroke-width="2.4" stroke-linecap="square"/>
<path d="M50.6 39.8H65.821" stroke="#005EB8" stroke-width="2.4" stroke-linecap="square"/>
<defs>
<filter id="filter0_d_0_18" x="16.4" y="28.8" width="57.6" height="57.2" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="4"/>
<feGaussianBlur stdDeviation="2.5"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0906646 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_0_18"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_0_18" result="shape"/>
</filter>
<filter id="filter1_d_0_18" x="51.6" y="28.8" width="30.8" height="21.2" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="4"/>
<feGaussianBlur stdDeviation="2.5"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0906646 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_0_18"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_0_18" result="shape"/>
</filter>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

+1 -75
View File
@@ -2831,7 +2831,7 @@
{
"id": "grafana",
"name": "Grafana",
"version": "12.4",
"version": "9.5.20",
"description": "Grafana is an open source platform for data visualization and monitoring.",
"logo": "grafana.svg",
"links": {
@@ -4097,27 +4097,6 @@
"scheduling"
]
},
{
"id": "moltbot",
"name": "Moltbot",
"version": "2026.1.25",
"description": "WhatsApp gateway CLI with Pi RPC agent - self-hosted AI-powered messaging platform",
"logo": "moltbot.svg",
"links": {
"github": "https://github.com/moltbot/moltbot",
"website": "https://molt.bot",
"docs": "https://docs.molt.bot"
},
"tags": [
"whatsapp",
"ai",
"messaging",
"chatbot",
"gateway",
"self-hosted",
"automation"
]
},
{
"id": "morphos",
"name": "Morphos",
@@ -5952,24 +5931,6 @@
"media"
]
},
{
"id": "strapi",
"name": "Strapi",
"version": "v5.33.0",
"description": "Open-source headless CMS to build powerful APIs with built-in content management.",
"logo": "strapi.svg",
"links": {
"github": "https://github.com/strapi/strapi",
"discord": "https://discord.com/invite/strapi",
"docs": "https://docs.strapi.io",
"website": "https://strapi.io"
},
"tags": [
"headless",
"cms",
"content-management"
]
},
{
"id": "supabase",
"name": "SupaBase",
@@ -6227,24 +6188,6 @@
"e-ink"
]
},
{
"id": "tuwunel",
"name": "Tuwunel",
"version": "v1.5.0",
"description": "High performance Matrix homeserver written in Rust. Official successor to conduwuit - a scalable, low-cost, enterprise-ready alternative to Synapse.",
"logo": "tuwunel.svg",
"links": {
"github": "https://github.com/matrix-construct/tuwunel",
"website": "https://tuwunel.chat",
"docs": "https://matrix-construct.github.io/tuwunel/"
},
"tags": [
"matrix",
"chat",
"messaging",
"rust"
]
},
{
"id": "twenty",
"name": "Twenty CRM",
@@ -6462,23 +6405,6 @@
"open-source"
]
},
{
"id": "verdaccio",
"name": "Verdaccio",
"version": "6",
"description": "A lightweight Node.js private proxy registry",
"logo": "verdaccio.svg",
"links": {
"github": "https://github.com/verdaccio/verdaccio",
"website": "https://www.verdaccio.org/",
"docs": "https://www.verdaccio.org/docs/what-is-verdaccio"
},
"tags": [
"node.js",
"package-repository",
"npm"
]
},
{
"id": "vikunja",
"name": "Vikunja",