From 882cb67f7acd722f6407e3a1af64718634bd9d83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Padez?= Date: Sat, 29 Aug 2026 13:06:00 +0100 Subject: [PATCH] todo: openseo as a plugin candidate, checked against the repo Co-Authored-By: Claude Fable 5 --- TODO.md | 77 ++++++++++--------- todo/integrations/_index.md | 8 ++ .../openseo-a-plugin-candidate.md | 49 ++++++++++++ 3 files changed, 96 insertions(+), 38 deletions(-) create mode 100644 todo/integrations/_index.md create mode 100644 todo/integrations/openseo-a-plugin-candidate.md diff --git a/TODO.md b/TODO.md index 410089b7..229e1b3d 100644 --- a/TODO.md +++ b/TODO.md @@ -22,44 +22,45 @@ the owner's OS user and can never be granted. Indirection there really is accide ## Themes -**106 open, 33 closed**, across 34 themes. +**107 open, 33 closed**, across 35 themes. -| Theme | Open | Closed | -| --- | --- | --- | -| [Affordances](todo/affordances/) | 2 | 0 | -| [Agents coordinating agents](todo/agent-coordination/) | 5 | 0 | -| [Speaking into a session from the backend](todo/agent-delivery/) | 1 | 1 | -| [Backburner](todo/backburner/) | 3 | 0 | -| [Background jobs](todo/background-jobs/) | 2 | 1 | -| [Calendar and contacts](todo/calendar/) | 1 | 0 | -| [Chat interface](todo/chat/) | 1 | 0 | -| [Code editor](todo/code-editor/) | 1 | 0 | -| [Components — the shared UI layer](todo/components/) | 1 | 0 | -| [Documentation conventions — AGENTS.md vs CLAUDE.md](todo/docs-conventions/) | 2 | 0 | -| [File watchers](todo/file-watchers/) | 1 | 0 | -| [Fleet — one command across every server](todo/fleet/) | 6 | 2 | -| [Headscale](todo/headscale/) | 0 | 5 | -| [Infra (alpha)](todo/infra/) | 7 | 0 | -| [Known bugs](todo/known-bugs/) | 6 | 4 | -| [Memory — one store instead of per-harness files](todo/memory/) | 1 | 0 | -| [Mobile apps](todo/mobile-apps/) | 5 | 0 | -| [Multi-user](todo/multi-user/) | 17 | 5 | -| [Notifications](todo/notifications/) | 1 | 0 | -| [Plugin ecosystem — before it opens to third parties (2026-08-18)](todo/plugin-ecosystem/) | 4 | 1 | -| [Plugin infrastructure](todo/plugin-infrastructure/) | 2 | 1 | -| [Plugin repos — what writing their READMEs turned up](todo/plugin-repos/) | 10 | 9 | -| [Plugin system — gaps the email extraction found (2026-08-18)](todo/plugin-system/) | 3 | 0 | -| [Prompt library](todo/prompt-library/) | 1 | 0 | -| [SendOff](todo/sendoff/) | 1 | 0 | -| [Settings — portable, and readable by an agent](todo/settings/) | 2 | 0 | -| [Shell — spotlight and the dock](todo/shell/) | 4 | 1 | -| [Sub-agents — agents spawning agents](todo/sub-agents/) | 0 | 2 | -| [Sudo terminal modal](todo/sudo-terminal-modal/) | 1 | 0 | -| [Tooling — the list about the list](todo/tooling/) | 0 | 1 | -| [Transmission](todo/transmission/) | 6 | 0 | -| [URL state — routing, query strings and selection](todo/url-state/) | 4 | 0 | -| [Waiting on the owner to run it](todo/waiting-on-owner/) | 3 | 0 | -| [Workspaces & Panels](todo/workspaces-panels/) | 2 | 0 | +| Theme | Open | Closed | +| ------------------------------------------------------------------------------------------ | ---- | ------ | +| [Affordances](todo/affordances/) | 2 | 0 | +| [Agents coordinating agents](todo/agent-coordination/) | 5 | 0 | +| [Speaking into a session from the backend](todo/agent-delivery/) | 1 | 1 | +| [Backburner](todo/backburner/) | 3 | 0 | +| [Background jobs](todo/background-jobs/) | 2 | 1 | +| [Calendar and contacts](todo/calendar/) | 1 | 0 | +| [Chat interface](todo/chat/) | 1 | 0 | +| [Code editor](todo/code-editor/) | 1 | 0 | +| [Components — the shared UI layer](todo/components/) | 1 | 0 | +| [Documentation conventions — AGENTS.md vs CLAUDE.md](todo/docs-conventions/) | 2 | 0 | +| [File watchers](todo/file-watchers/) | 1 | 0 | +| [Fleet — one command across every server](todo/fleet/) | 6 | 2 | +| [Headscale](todo/headscale/) | 0 | 5 | +| [Infra (alpha)](todo/infra/) | 7 | 0 | +| [Integrations — external tools worth wrapping as a plugin](todo/integrations/) | 1 | 0 | +| [Known bugs](todo/known-bugs/) | 6 | 4 | +| [Memory — one store instead of per-harness files](todo/memory/) | 1 | 0 | +| [Mobile apps](todo/mobile-apps/) | 5 | 0 | +| [Multi-user](todo/multi-user/) | 17 | 5 | +| [Notifications](todo/notifications/) | 1 | 0 | +| [Plugin ecosystem — before it opens to third parties (2026-08-18)](todo/plugin-ecosystem/) | 4 | 1 | +| [Plugin infrastructure](todo/plugin-infrastructure/) | 2 | 1 | +| [Plugin repos — what writing their READMEs turned up](todo/plugin-repos/) | 10 | 9 | +| [Plugin system — gaps the email extraction found (2026-08-18)](todo/plugin-system/) | 3 | 0 | +| [Prompt library](todo/prompt-library/) | 1 | 0 | +| [SendOff](todo/sendoff/) | 1 | 0 | +| [Settings — portable, and readable by an agent](todo/settings/) | 2 | 0 | +| [Shell — spotlight and the dock](todo/shell/) | 4 | 1 | +| [Sub-agents — agents spawning agents](todo/sub-agents/) | 0 | 2 | +| [Sudo terminal modal](todo/sudo-terminal-modal/) | 1 | 0 | +| [Tooling — the list about the list](todo/tooling/) | 0 | 1 | +| [Transmission](todo/transmission/) | 6 | 0 | +| [URL state — routing, query strings and selection](todo/url-state/) | 4 | 0 | +| [Waiting on the owner to run it](todo/waiting-on-owner/) | 3 | 0 | +| [Workspaces & Panels](todo/workspaces-panels/) | 2 | 0 | ## Records — no items, kept for the reasoning @@ -73,10 +74,10 @@ the owner's OS user and can never be granted. Indirection there really is accide - `2026-08-27` **Turn an ordinary chat into a commander or a bot, carrying its context along** — [agent-coordination/turn-a-chat-into-a-commander-or-a-bot](todo/agent-coordination/turn-a-chat-into-a-commander-or-a-bot.md) - `2026-08-27` **The calendar API cannot express repeating events, reminders, invitees or a cancelled occurrence** — [calendar/the-json-api-cannot-express-recurrence-alarms](todo/calendar/the-json-api-cannot-express-recurrence-alarms.md) - `2026-08-27` **AGENTS.md sweep — what is left after the static docs landed** — [docs-conventions/agents-md-remaining](todo/docs-conventions/agents-md-remaining.md) +- `2026-08-27` **OpenSEO — a strong plugin candidate, checked rather than assumed** — [integrations/openseo-a-plugin-candidate](todo/integrations/openseo-a-plugin-candidate.md) - `2026-08-27` **The calendar/contacts skill has never been exercised by an actual agent** — [known-bugs/calendar-skill-never-used-by-an-agent](todo/known-bugs/calendar-skill-never-used-by-an-agent.md) - `2026-08-27` **Setting up a phone for calendar and contacts should be one link inside Officer, not a manual account form** — [mobile-apps/setting-up-a-phone-should-be-a-link-in-the-app](todo/mobile-apps/setting-up-a-phone-should-be-a-link-in-the-app.md) - `2026-08-27` **Marketplace: browse by tag — filter list, card grid, detail with a back button** — [plugin-ecosystem/marketplace-browse-by-tag](todo/plugin-ecosystem/marketplace-browse-by-tag.md) - `2026-08-25` **An affordance: a scoped agent warns when a request lands outside its scope** — [affordances/an-affordance-a-scoped-agent-warns-on-the](todo/affordances/an-affordance-a-scoped-agent-warns-on-the.md) - `2026-08-25` **Commit signing is inconsistent across harnesses — Claude names itself, opencode names nothing** — [agent-coordination/commit-signing-is-inconsistent-across-harnesses](todo/agent-coordination/commit-signing-is-inconsistent-across-harnesses.md) - `2026-08-25` **A commander's watcher does not survive a reboot, and nothing says so** — [agent-coordination/a-commander-s-watcher-does-not-survive-a-reboot](todo/agent-coordination/a-commander-s-watcher-does-not-survive-a-reboot.md) -- `2026-08-25` **Resurrect Projects/Apps** — [backburner/resurrect-projects-apps](todo/backburner/resurrect-projects-apps.md) diff --git a/todo/integrations/_index.md b/todo/integrations/_index.md new file mode 100644 index 00000000..5c1b6f11 --- /dev/null +++ b/todo/integrations/_index.md @@ -0,0 +1,8 @@ +--- +theme: integrations +heading: 'Integrations — external tools worth wrapping as a plugin' +kind: theme +--- + +Third-party self-hosted tools evaluated for a plugin, with what was actually checked (license, +activity, self-hosting shape, credential cost) rather than a name someone liked. diff --git a/todo/integrations/openseo-a-plugin-candidate.md b/todo/integrations/openseo-a-plugin-candidate.md new file mode 100644 index 00000000..6458df57 --- /dev/null +++ b/todo/integrations/openseo-a-plugin-candidate.md @@ -0,0 +1,49 @@ +--- +id: integrations/openseo-a-plugin-candidate +title: 'OpenSEO — a strong plugin candidate, checked rather than assumed' +theme: integrations +status: open +created: 2026-08-27 +date_source: stated +order: 1 +--- + +**OpenSEO (`every-app/open-seo`) — worth building a plugin around.** Asked to be evaluated 2026-08-27; +checked against gitea rather than taken on the README's word. + +**What it is:** a self-hosted, open-source alternative to Semrush/Ahrefs — keyword research, rank +tracking, competitor insights, backlinks, site audits, AI visibility. MIT licensed, TypeScript, +**14.4k stars, 1.7k forks, pushed 3 days ago** (verified via `gh repo view`, not the README's own +framing) — a real, active project, not an abandoned demo. + +**Why it fits this platform specifically, more than most tools would:** it ships **its own MCP server +and Agent Skills**, built explicitly to be driven by "Claude Code, OpenClaw, or Hermes." That is +Officer's whole plugin thesis already built by someone else — most candidates need Officer to invent +the agent-facing surface; this one already has one. + +**The self-hosting shape is the easy case, verified from `compose.yaml` and the docs, not assumed:** + +- **One container, no separate database.** Cloudflare D1 (SQLite) by default — Postgres is opt-in only + for installs that outgrow it (`docs/LOCAL_POSTGRES.md`). Same shape as Jellyfin, Gitea, Transmission: + a single sidecar, nothing extra to provision. +- **One required credential**: a DataForSEO API key, paid pay-as-you-go DIRECTLY to DataForSEO — not a + subscription to OpenSEO itself unless using their hosted version. Two more are optional + (OpenRouter for its own AI features, Google OAuth for Search Console). Real cost, worth saying + plainly: this is free software over a metered API, not a free service. +- **Self-hosting runs `AUTH_MODE=local_noauth` by design** — their own docs say explicitly _"only + expose it behind your own auth-protected reverse proxy, tunnel, or private network."_ That sentence + describes exactly what an Officer plugin already is: mounted behind Officer's own permission gate, + never exposed on its own. This is the ordinary case for a plugin here, not a special risk to design + around. + +**What a plugin would actually need to add, and it may be less than usual:** because OpenSEO already +runs its own MCP server, the plugin's job is closer to credential plumbing and a UI surface +(`osDependencies`-style container/sidecar, the DataForSEO key in the per-user/server credential store, +a panel embedding or proxying its web UI) than inventing new MCP tools from scratch — most of the +agent-facing work is already done upstream. + +Open, for whoever picks this up: whether Officer's agents call OpenSEO's own MCP endpoint directly +(simplest, if reachable over whatever network the plugin runs on) or Officer wraps it as +Officer-native MCP tools for consistency with how other plugins expose theirs; and where the container +runs given `todo/infra/opm-officer-s-own-process-manager` is heading toward the Docker network +specifically so container-backed dependencies like this one need no published host port.