import type { PluginManifest } from '@@/plugins/manifest'; /** * OpenSEO — self-hosted SEO research, behind Officer's permission gate. * * ── It points at an instance; it does not own one ── * * OpenSEO is a container, and a plugin has no primitive for "bring a container": `osDependencies` * installs OS packages. So this follows the shape `jellyfin`, `gitea` and `proxy-manager` already use — * a stored connection to a service running somewhere, with the credential write-only across the * boundary. * * That is a decision to revisit rather than a permanent one. `todo/infra/opm-officer-s-own-process-manager` * is heading toward the Docker network, and on the day a plugin can declare a container the connection * becomes something this plugin provisions instead of something somebody types. * * ── Why the mount matters more here than usual ── * * Upstream self-hosting runs `AUTH_MODE=local_noauth` by design, and their docs say to expose it only * behind auth. Everything this plugin serves is therefore gated by Officer, and the pass-through below * is the only door. Nothing here may publish OpenSEO's own port. */ export const manifest: PluginManifest = { name: 'OpenSEO', description: 'Keyword research, rank tracking, competitors, backlinks and site audits — self-hosted.', mountPrefix: '/openseo', version: '0.1.0', }; export default manifest;