2026-08-08 19:05:58 +02:00
{
"schema_version" : 1 ,
2026-08-23 12:43:03 +02:00
"observed_at" : "2026-08-21" ,
"notes" : "Runtime-verified detectors for the LXC app catalog. Every entry is a detector proven to work on a real container, either in maintainer testing or a reviewed community confirmation. Contribution rules \u2014 accept ONLY: `detector` (required, with installed_via + method-specific fields + repo/tag_regex), optional `alt_detectors` (cross-method fallbacks), optional `file_fallbacks` (same-method secondary paths). REJECT anything that identifies a host: no IP addresses, no VMIDs, no hostnames, no `evidence` blocks with those fields. Report reproduction context in the PR description instead \u2014 the committed JSON must stay generic." ,
2026-08-08 19:05:58 +02:00
"apps" : {
2026-08-23 12:43:03 +02:00
"docker" : {
"operational" : true ,
"install_scope" : [
"community-script" ,
"manual"
],
"detector" : {
"installed_via" : "binary" ,
"binary_path" : "/usr/bin/docker" ,
"binary_args" : [
"--version"
],
"repo" : "moby/moby" ,
"github_source" : "releases" ,
"tag_regex" : "v?(\\d+\\.\\d+\\.\\d+)"
}
},
"portainer" : {
"operational" : true ,
"name" : "Portainer" ,
"install_scope" : [
"docker"
],
"detector" : {
"installed_via" : "docker_exec" ,
"container_name" : "portainer" ,
"binary_path" : "/portainer" ,
"binary_args" : [
"--version"
],
"repo" : "portainer/portainer" ,
"github_source" : "releases" ,
"tag_regex" : "v?(\\d+\\.\\d+\\.\\d+)"
},
"default_ports" : [
9000 ,
9443
],
"logo" : "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/portainer.webp" ,
"website" : "https://www.portainer.io/"
},
"audiobookshelf" : {
"operational" : true ,
"name" : "Audiobookshelf" ,
"install_scope" : [
"community-script" ,
"manual-if-same-package"
],
"evidence" : [
"community-confirmed:github-discussion-306"
],
"detector" : {
"installed_via" : "dpkg" ,
"package" : "audiobookshelf" ,
"repo" : "advplyr/audiobookshelf" ,
"github_source" : "releases" ,
"tag_regex" : "(?i)(?:v|release[-_/]?)?(\\d+(?:\\.\\d+){1,3}(?:[-+._][0-9A-Za-z.-]+)?)"
}
},
"gitea" : {
"operational" : true ,
"name" : "Gitea" ,
"install_scope" : [
"community-script" ,
"manual-if-same-package"
],
"evidence" : [
"community-confirmed:github-discussion-306"
],
"detector" : {
"installed_via" : "apk" ,
"package" : "gitea" ,
"repo" : "go-gitea/gitea" ,
"github_source" : "releases" ,
"tag_regex" : "v?(\\d+\\.\\d+\\.\\d+)"
}
},
"dispatcharr" : {
"operational" : true ,
"name" : "Dispatcharr" ,
"install_scope" : [
"community-script"
],
"evidence" : [
"community-confirmed:github-discussion-306"
],
"detector" : {
"installed_via" : "file" ,
"file_path" : "/root/.dispatcharr" ,
"file_regex" : "(\\d+\\.\\d+\\.\\d+)" ,
"repo" : "Dispatcharr/Dispatcharr" ,
"github_source" : "releases" ,
"tag_regex" : "v?(\\d+\\.\\d+\\.\\d+)"
}
},
"kavita" : {
"operational" : true ,
"name" : "Kavita" ,
"install_scope" : [
"community-script"
],
"evidence" : [
"community-confirmed:github-discussion-306"
],
"detector" : {
"installed_via" : "file" ,
"file_path" : "/root/.kavita" ,
"file_regex" : "(\\d+\\.\\d+\\.\\d+)" ,
"repo" : "Kareadita/Kavita" ,
"github_source" : "releases" ,
"tag_regex" : "v?(\\d+\\.\\d+\\.\\d+)"
}
},
2026-08-08 19:05:58 +02:00
"qbittorrent" : {
"detector" : {
"installed_via" : "binary" ,
"binary_path" : "/opt/qbittorrent/qbittorrent-nox" ,
"repo" : "userdocs/qbittorrent-nox-static" ,
"github_source" : "releases" ,
"tag_regex" : "(?i)(?:release-)?(\\d+\\.\\d+\\.\\d+)"
}
},
"tandoor" : {
"detector" : {
"installed_via" : "file" ,
"file_path" : "/opt/tandoor/cookbook/version_info.py" ,
"file_regex" : "TANDOOR_VERSION\\s*=\\s*[\"']v?(\\d+\\.\\d+\\.\\d+)" ,
"repo" : "TandoorRecipes/recipes" ,
"github_source" : "releases" ,
"tag_regex" : "v?(\\d+\\.\\d+\\.\\d+)"
},
"file_fallbacks" : [
{
"path" : "/root/.tandoor" ,
"regex" : "v?(\\d+\\.\\d+\\.\\d+)"
}
]
},
"openwebui" : {
2026-08-23 12:43:03 +02:00
"operational" : true ,
2026-08-08 19:05:58 +02:00
"detector" : {
"installed_via" : "python_dist" ,
"python_path" : "/root/.local/share/uv/tools/open-webui/bin/python" ,
"distribution" : "open-webui" ,
"repo" : "open-webui/open-webui" ,
"github_source" : "releases" ,
"tag_regex" : "v?(\\d+\\.\\d+\\.\\d+)"
}
},
"proxmox-backup-server" : {
"detector" : {
"installed_via" : "dpkg" ,
"package" : "proxmox-backup-server" ,
"tag_regex" : "(\\d+\\.\\d+\\.\\d+)"
}
},
2026-08-23 12:43:03 +02:00
"jellyfin" : {
"detector" : {
"installed_via" : "dpkg" ,
"package" : "jellyfin" ,
"repo" : "jellyfin/jellyfin" ,
"github_source" : "releases" ,
"tag_regex" : "(?i)(?:v|release[-_/]?)?(\\d+(?:\\.\\d+){1,3}(?:[-+._][0-9A-Za-z.-]+)?)"
}
},
2026-08-08 19:05:58 +02:00
"adguard" : {
"detector" : {
"installed_via" : "binary" ,
"binary_path" : "/opt/AdGuardHome/AdGuardHome" ,
"repo" : "AdguardTeam/AdGuardHome" ,
"github_source" : "releases" ,
"tag_regex" : "v?(\\d+\\.\\d+\\.\\d+)"
}
},
"nginxproxymanager" : {
"detector" : {
"installed_via" : "file" ,
"file_path" : "/opt/nginxproxymanager/backend/package.json" ,
"file_regex" : "\"version\"\\s*:\\s*\"(\\d+\\.\\d+\\.\\d+)\"" ,
"repo" : "NginxProxyManager/nginx-proxy-manager" ,
"github_source" : "releases" ,
"tag_regex" : "v?(\\d+\\.\\d+\\.\\d+)"
},
"file_fallbacks" : [
{
"path" : "/app/package.json" ,
"regex" : "\"version\"\\s*:\\s*\"(\\d+\\.\\d+\\.\\d+)\""
},
{
"path" : "/root/.nginxproxymanager" ,
"regex" : "v?(\\d+\\.\\d+\\.\\d+)"
}
]
},
"pairdrop" : {
"detector" : {
"installed_via" : "file" ,
"file_path" : "/opt/pairdrop/package.json" ,
"file_regex" : "\"version\"\\s*:\\s*\"(\\d+\\.\\d+\\.\\d+)\"" ,
"repo" : "schlagmichdoch/PairDrop" ,
"github_source" : "releases" ,
"tag_regex" : "v?(\\d+\\.\\d+\\.\\d+)"
},
"file_fallbacks" : [
{
"path" : "/root/.pairdrop" ,
"regex" : "v?(\\d+\\.\\d+\\.\\d+)"
}
]
},
"vaultwarden" : {
"detector" : {
"installed_via" : "binary" ,
"binary_path" : "/opt/vaultwarden/bin/vaultwarden" ,
"repo" : "dani-garcia/vaultwarden" ,
"github_source" : "releases" ,
"tag_regex" : "v?(\\d+\\.\\d+\\.\\d+)"
},
"alt_detectors" : [
{
"installed_via" : "file" ,
"file_path" : "/root/.vaultwarden" ,
"file_regex" : "v?(\\d+\\.\\d+\\.\\d+)"
}
]
},
"docmost" : {
"detector" : {
"installed_via" : "file" ,
"file_path" : "/opt/docmost/package.json" ,
"file_regex" : "\"version\"\\s*:\\s*\"(\\d+\\.\\d+\\.\\d+)\"" ,
"repo" : "docmost/docmost" ,
"github_source" : "releases" ,
"tag_regex" : "v?(\\d+\\.\\d+\\.\\d+)"
},
"file_fallbacks" : [
{
"path" : "/root/.docmost" ,
"regex" : "v?(\\d+\\.\\d+\\.\\d+)"
}
]
},
"agentdvr" : {
"detector" : {
"installed_via" : "file" ,
"file_path" : "/root/.agentdvr" ,
"file_regex" : "Agent_[^/]+_([0-9]+(?:_[0-9]+){3})\\.zip" ,
"repo" : "ispysoftware/agent-install-scripts" ,
"github_source" : "releases" ,
"tag_regex" : "v?(\\d+(?:\\.\\d+){3})"
}
},
"odoo" : {
"detector" : {
"installed_via" : "dpkg" ,
"package" : "odoo" ,
"tag_regex" : "(\\d+\\.\\d+(?:\\.\\d+)?)"
},
"alt_detectors" : [
{
"installed_via" : "binary" ,
"binary_path" : "/usr/bin/odoo"
}
]
},
"paperless-ngx" : {
"operational" : false ,
"detector" : {
"installed_via" : "docker_label" ,
"container_name" : "paperless-webserver-1" ,
"label" : "org.opencontainers.image.version" ,
"repo" : "paperless-ngx/paperless-ngx" ,
"github_source" : "releases" ,
"tag_regex" : "v?(\\d+\\.\\d+\\.\\d+)"
},
"alt_detectors" : [
{
"installed_via" : "file" ,
"file_path" : "/opt/paperless/src/paperless/version.py" ,
"file_regex" : "__version__[^\\n=]*=\\s*\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\)"
}
]
},
"plex" : {
"operational" : true ,
"detector" : {
"installed_via" : "dpkg" ,
"package" : "plexmediaserver" ,
"installed_regex" : "(\\d+\\.\\d+\\.\\d+\\.\\d+)" ,
"upstream_type" : "http_json" ,
"upstream_url" : "https://plex.tv/api/downloads/5.json?channel=8" ,
"upstream_json_path" : "computer.Linux.version" ,
"tag_regex" : "(\\d+\\.\\d+\\.\\d+\\.\\d+)"
}
},
"prometheus" : {
"operational" : false ,
"detector" : {
"installed_via" : "docker_exec" ,
"container_name" : "prometheus" ,
"binary_path" : "/bin/prometheus" ,
"binary_args" : [
"--version"
],
"repo" : "prometheus/prometheus" ,
"github_source" : "releases" ,
"tag_regex" : "v?(\\d+\\.\\d+\\.\\d+)"
}
},
"grafana" : {
"operational" : false ,
"detector" : {
"installed_via" : "docker_exec" ,
"container_name" : "grafana" ,
"binary_path" : "grafana" ,
"binary_args" : [
"server" ,
"-v"
],
"repo" : "grafana/grafana" ,
"github_source" : "releases" ,
"tag_regex" : "v?(\\d+\\.\\d+\\.\\d+)"
}
2026-08-23 12:43:03 +02:00
},
"searxng" : {
"operational" : true ,
"install_scope" : [
"community-script" ,
"manual-if-same-venv"
],
"detector" : {
"installed_via" : "python_dist" ,
"python_path" : "/usr/local/searxng/searx-pyenv/bin/python" ,
"distribution" : "searxng" ,
"installed_regex" : "(\\d+\\.\\d+\\.\\d+\\+[0-9a-f]+)"
}
2026-08-08 19:05:58 +02:00
}
}
}