Shared conventions across all Voyager WordPress repos — naming, auth, API patterns, commit format, release process, and dependency relationships.
| Repo | Type | Purpose |
|---|---|---|
voyager-orbit | Plugin | Lead tracking, analytics, AI abilities, REST API, MCP |
voyager-core | Plugin | CPTs, meta fields, GSAP registration, entrance animations |
voyager-blocks | Plugin | 28 Gutenberg blocks, 114 patterns, 13 extensions |
voyager-block-theme | Theme | Parent block theme (88 patterns, design system) |
voyagermark | Theme | Agency site child theme |
| Client child themes | Theme | Per-client child themes extending voyager-block-theme |
voyager-block-theme (parent)
└── voyagermark / client themes (children)
voyager-core (required by)
├── voyager-blocks (soft dep — GSAP, entrance animations)
└── voyager-orbit (independent, but co-installed)
voyager/{block-slug} — kebab-casesrc/blocks/{block-slug}/wp-block-voyager-{block-slug}voyagervoyager-blocks{theme-slug}/{pattern-name} (e.g., voyagermark/hero-home)glob() from patterns/ directoryvoyager/v1{ data: T[], total: N } for listsAuthMiddleware (see below)Voyager\Orbit\{Module}\{Class}src/ → Voyager\Orbit\)declare(strict_types=1)All Voyager REST endpoints use the same three-tier auth:
current_user_can('manage_options') — bypasses API authX-Voyager-Site-Id — site domainX-Voyager-Signature — sha256= + HMAC of payloadX-Voyager-Timestamp — Unix timestamp (300s drift max)Authorization: Bearer {token} (legacy fallback)Constant-time comparison via hash_equals() everywhere.
Every Voyager repo follows these rules:
$wpdb->prepare() for all dynamic SQL — never string concatenationsanitize_text_field(), sanitize_email(), esc_url_raw() for inputesc_html(), esc_attr(), esc_url() for outputhash_equals() for all secret comparisonseval(), shell_exec(), exec(), system()prefers-reduced-motion: reduce respected in all animationsAll repos use Conventional Commits: