Where Node stands#
Unlike a forward phase plan, Node’s “foundation
plan” is mostly history: the plugin is feature-complete and
in maintenance. Link management, click tracking, A/B testing,
dynamic rules, auto-link, the Content Graph with 14 elements, SEO
Stats, Link Stats, the REST API, GDPR compliance, bot detection,
QR codes, GeoIP, URL shorteners, and health check are all
shipped; the Google + Rank Tracker system sits on
top of that foundation. The repo migrated from the legacy
fishy-links name to gillish-node (the
old folder deleted; only changelog history and a few
“Port of fishy-links” provenance comments
remain). What follows is the shipped narrative, then the defined
backlog.
Build history#
Phases 1–3: foundation, port, rework#
Phase 1 (Foundation) established the PSR-4 tree, the CPT, the stats schema, and the unified Gillish admin menu. Phase 2 (Systems port, 9 chunks) brought the full link-management feature set across. Phase 3 (Rework + admin pages) closed the redirect/render pipeline, the editor integrations across all four surfaces, and the Content Graph element pipeline. All three are complete.
Google + Rank Tracker#
Service-account auth plus the daily GSC/GA4 sync (Phases 1–6 of the Google plan), then the Rank Tracker module (pin list + history snapshots + movement alerts), the Search Performance admin page, and the full 16-month historical backfill module (Phases A–E: schema + state, runner, auto-trigger + cron chaining, Force Resync with idiot-proof guards, the weekly rollup for >90-day data).
Dynamic Tags → Core#
v2.74.0–v2.74.4: 22 opt-in shortcodes for evergreen content (date/time, copyright spans, post views, read time, visitor IP) with conflict-aware registration and an allow-listed inline processor for managed-link anchor text. Off by default. The tag engine was then extracted to Gillish Core in v2.91.30, so the tags now work across the whole site, not just inside Node. Node keeps only the inline processor that expands those tags inside managed-link anchor text when Core is active, the same mirrored-extraction shape as Conditional Content below.
Post-audit + Plugin Check + Semgrep#
The post-audit cleanup window (v2.74.5 → v2.76.0) ran a full-codebase audit, an A/B-toggle gate bug, silent partial-save failures in the link editor, uninstall hardening, cache-safe dynamic tags, and six verification follow-ups, each on its own commit for clean bisects. Then the Plugin Check cleanup (v2.76.1 → v2.76.8) closed every wp.org-blocking finding, and a Semgrep security pass (v2.77.0 → v2.77.5) followed.
Dashboard redesign + dark mode#
v2.78.0 → v2.78.6 rebuilt the dashboard as a bento grid (layout, real data, a Chart.js click-trend with drill-down, a Content Graph mini-preview, an onboarding wizard). The dark-mode rollout (v2.78.7 → v2.78.29) then took the global colour-scheme switcher across every admin page, 22 follow-up fixes that are why the light + dark pairing rule is now non-negotiable for new work.
Conditional Content → Cairnstone#
The Conditional Content module shipped in
v2.79.0 → v2.90.9 (phases 1–7 + a
verification round), then was extracted to the
standalone Gillish Cairnstone plugin in v2.91.0. Cairnstone
now owns the block, shortcode, settings tab, analytics page, REST
endpoint, and its events table; Node’s v2.91.0 migration
dropped the legacy table and swept the related options. Cairnstone
reads visitor country through Node’s existing
gillish_node_resolve_country_code filter when both
are active, the first better-together bridge.
The catch-up + maintenance line#
A 13-version uncommitted history (v2.78.29 → v2.91.5)
was landed as one honest catch-up commit, the dev toolchain was
brought into git and upgraded (PHPStan 2.1), the
.plans/→plans/ rename made the planning docs
Obsidian-visible, the minimum PHP was raised 8.1 → 8.2
(so the floor is exercised on the local matrix), and the
in-admin Documentation page was removed in v2.91.6 in favour of
this ecosystem docs site, mirroring the move Gillish
Cairnstone made earlier.
Active roadmap#
Active plans live in plans/; when one ships it is
summarised in plans/DONE-WORK.md and the original
file deleted, so the list below is always pending-or-in-progress
work.
High priority: direct revenue or adoption impact#
- Cairnstone Synergy, hooks + REST + Disclosure injector. Four sequenced chunks: the
gillish_node_resolve_managed_linkfilter, the Sandbox REST endpoints (typeahead, single-link, compact health), thethe_contentAffiliate-Disclosure auto-injector, and the per-post + global override surface. Node v2.92.x exposes the read surface; Node v2.93.x ships the injector once Cairnstone has a disclosure block to inject. - Migration wizard for 9 competitor plugins ·
IMPORT-EXPORT-PLAN.md. One guided wizard, one adapter per source (Pretty Links, ThirstyAffiliates, Lasso, Link Whisper, ILJ, Linkilo, Rank Math, AAWP, Auto Affiliate, Easy Affiliate), one undo token per import. LinkCentral shipped as Phase 1. - Competitive feature-parity closure ·
COMPETITIVE-FEATURE-GAPS-PLAN.md. Cross-walks every competitor feature against Node’s coverage; Tier 1 unblocks migration fidelity, Tier 3 (Amazon PA-API, product showcase) opens a new category. - Lemon Squeezy / Pro licensing ·
lemon-squeezy-plan.md. License manager, activation/validation/deactivation, encrypted key storage, WP-Cron revalidation, update checker, and feature gating via the existingFeatureGatestub. Required for any commercial release.
Medium priority: meaningful feature wins#
- A/B Testing enhancement backlog ·
AB-TESTING-PLAN.md. MVP shipped; significance click-lead alerts (daily cron + rate-limited email + dismissible admin notice, honest framing: "click lead", never "winner") landed in v2.91.29. Pending: RESTvariant_id+/ab-testroutes, drag-to-reorder variants, an active-tests dashboard widget, demo-data seed, and the now-unblocked auto-pause-losing-variants follow-up. (Conversion / multivariate split-testing routed out to a standalone-plugin concept.)
Lower priority: niche or experimental#
- External link hover preview ·
Plan - hover preview.MD. Screenshot-based hover previews on external links, third-party screenshot API + frontend JS hooked intoLinkRenderer::render_anchor(), cached underwp_upload.
Competitor Analysis was moved out of Node’s roadmap on 2026-05-02, bundling a crawler in a link-management plugin carried reputational and ethical cost, so it is now scoped as its own standalone plugin, Gillish Mesh. AI/LLM work is deferred indefinitely per a standing decision.
The plans corpus#
The plans/ folder is excluded from the build zip
, these documents never reach end users, but it is
the strategic working surface. This page mirrors its shape; the
folder itself is not relocated. Its structure:
- Active plans: the roadmap files above (
IMPORT-EXPORT-PLAN.md,COMPETITIVE-FEATURE-GAPS-PLAN.md,lemon-squeezy-plan.md,AB-TESTING-PLAN.md,GOOGLE-ANALYTICS-SEARCH-CONSOLE-PLAN.md,GEOIP-BUNDLED-DATABASE-PLAN.md,Plan - hover preview.MD). - Shipped log:
DONE-WORK.md· every finished plan is summarised at the top under a dated section (concretesrc/paths, option keys, hook names) and the original plan file deleted, so finished work doesn’t pile up next to active work. - Three cross-plan holding tanks:
deferred-plans.md(fully scoped but blocked on a decision or deferred on low ROI),polish-backlog.md(ad-hoc micro-improvements), andAI-implementation-plans.md(every AI/LLM idea; AI is deferred). Each is self-contained, a future agent can act on an entry without reading the origin plan. - Reference:
autolink-current-system-overview.md(the go-to read before touching the auto-link engine),adjacent-initiatives-from-autolink-brainstorm.md(triage tank),on-demand.md(future possibilities). - Competitive intelligence: the per-competitor research that feeds the migration + parity plans lives in a separate
gillish-compssibling tree (moved out ofplans/2026-05-16), not in the plugin repo; the active plans above consume it.
Ecosystem position#
Node is one tool in the Gillish network (Core · Node
· Cairnstone · Feed · Mesh). It stands on its
own and gets better together with the siblings:
its gillish_node_resolve_country_code filter already
feeds Cairnstone’s Conditional Content, and the planned
Cairnstone Synergy surface (above) makes Node the link
intelligence hub behind Cairnstone’s design layer. When Gillish
Mesh ships, a small Node-side change adds cross-navigation so
users running both get a soft better-together experience,
without Node itself growing beyond its scope. Ecosystem-spanning
infrastructure (this docs network, global memory) is owned by
Gillish Core, not lodged in whichever plugin created it
first.