plugins/ ships baked into the image and gets wiped/replaced by the checkout sync on every deploy (docs/deployment.adoc), so a private plugin dropped there — the exact use case the plugin contract was designed for — didn't survive a redeploy the way uploaded GPX/kiwix data under data/ does. Plugins.list/run now accept either one directory or an array, and app.rb checks the built-in plugins/ plus data/plugins/ (already covered by the existing ./data bind mount, no new volume needed).