BlueCrocus PPC
Headless landing page builder with visual editor for PPC campaigns.
Install
The author publishes release zips, so WP-CLI can install straight from GitHub:
wp plugin install https://github.com/tales-bluecrocus/byrde/releases/download/v2.1.10/byrde.zipReadme
Byrde — BlueCrocus site builder
WordPress plugin for full-site pages and posts. Standalone templates; the active theme does not render Byrde documents. Visual work: (1) tokens + library definitions, (2) studio canvas with Blocks and Pages libraries.
Features
- Byrde Pages — CPT
byrde_landinginternally; kindspage | post | legal. URLs at/,/{slug},/blog/{slug} - Studio — Library (Blocks | Pages), canvas, stack reorder/shuffle, token toolbar
- PageTemplates — Landing, Contact, About, Pricing, Blog index/post, Legal
- SiteDesign — Light/dark tokens, font pairings, radius. CSS variables only
- Contact Form — Validation, honeypot, attribution, Postmark /
wp_mail(),byrde_leadCPT - SEO — Indexable by default; JSON-LD from published PageDocument
- Auto-Updates — Self-hosted JSON (
updates.bluecrocus.ca), not GitHub as live channel
Requirements
- WordPress 6.0+ (tested up to 6.7)
- PHP 8.0+
- Node.js 20+
Installation
From GitHub Release (Recommended)
- Download
byrde.zipfrom the latest release - In WordPress, go to Plugins → Add New → Upload Plugin
- Upload the ZIP and activate
From Source
git clone git@github.com:tales-bluecrocus/byrde.git
cd byrde
composer install --no-dev
cd front-end
npm install
npm run build
Then symlink or copy the byrde/ folder into wp-content/plugins/.
Configuration
Plugin Settings
Go to Settings → Theme Settings in the WordPress admin. Configure:
- Brand — Logo, phone number, email
- Brand Colors — Dark/light mode primary, accent, and text colors
- Button Style — Border width, radius, shadow, text colors per mode
- Google Reviews — Rating, review count, reviews URL
- Footer — Tagline, description, address, business hours, copyright
- Social Links — Facebook, Instagram, YouTube, Yelp, Google
- SEO — Site name, tagline, description, keywords, OG image
- Schema — LocalBusiness type, address, geo coordinates, opening hours, service radius
- Analytics — GA4 Measurement ID, GTM Container ID, Meta Pixel ID, Google Ads conversion labels
- Legal — Privacy policy, terms, cookie settings URLs
- Contact Form — Postmark API token, to/from/CC/BCC emails, subject line
Visual Editor
Go to Byrde Pages → New from template, then Edit with Byrde.
The studio lets you:
- Insert sections from the Blocks library and instantiate Pages from templates
- Shuffle a section for another definition in the same category
- Reorder / delete / clear the stack
- Edit block slots (no free CSS)
- Change SiteDesign tokens (primary, radius, fonts, light/dark)
- Save draft (
PageDocument) and Publish
Tech Stack
| Layer | Technology |
|---|---|
| CMS | WordPress 6.x |
| Backend | PHP 8.0+ with PSR-4 autoloading (Composer) |
| Frontend | React 19 + TypeScript 5.9 |
| Build | Vite 7 (multi-entry, content-hashed filenames) |
| Styling | Tailwind CSS 4 |
| UI Components | shadcn/ui (Radix primitives) |
| Icons | Lucide React + FontAwesome (brand icons) |
| Carousel | Embla Carousel (with autoplay) |
| Drag & Drop | @dnd-kit |
| Color Picker | react-colorful |
| State Management | React Context API |
| Settings | Native WordPress options (byrde_theme_settings) |
Postmark API (primary) + wp_mail() (fallback) |
|
| Auto-Updates | Plugin Update Checker v5 via self-hosted JSON metadata |
Project Structure
byrde/
├── byrde.php # Plugin entry point (constants, autoload, boot)
├── src/ # PHP classes (PSR-4, namespace Byrde\)
│ ├── Plugin.php # Bootstrap: instantiates all modules
│ ├── Core/ # Constants, Helpers, Logo
│ ├── Assets/ # AssetManager (enqueue, preload, critical CSS)
│ ├── Settings/ # Theme settings CRUD + Cache (12 hosting/CDN purge layers)
│ ├── Security/ # Cleanup (XML-RPC), Validators, RateLimiter, CookieConsent
│ ├── Content/ # CPT, TemplateLoader, SEO, Shortcodes, LegalPages
│ ├── API/ # REST endpoints, ContactForm, Abilities (MCP)
│ ├── Admin/ # SettingsPage, PageEditor, Onboarding
│ └── Migration/ # Theme→Plugin migration, color schema migrations (v2→v4)
├── front-end/ # React application
│ ├── index.html # Production entry (lightweight, no editor)
│ ├── editor.html # Editor entry (includes ThemeEditor)
│ ├── vite.config.ts # Production build config
│ ├── vite.config.editor.ts # Editor build config (separate output)
│ ├── src/
│ │ ├── main.tsx # Production bootstrap (+ onboarding lazy load)
│ │ ├── editor-main.tsx # Editor bootstrap (imports ThemeEditor)
│ │ ├── App.tsx # Shared app (7 nested context providers)
│ │ ├── components/ # React components (one per section)
│ │ │ ├── ThemeEditor/ # Visual editor sidebar + panels
│ │ │ ├── Onboarding/ # Setup wizard
│ │ │ └── ui/ # shadcn/ui primitives
│ │ ├── context/ # React Contexts (Settings, GlobalConfig, SectionTheme, HeaderConfig, Content, Sidebar)
│ │ ├── hooks/ # Custom hooks (useSettings, useSectionPalette, useAnalytics)
│ │ ├── lib/ # Utilities (analytics, phone formatting)
│ │ └── utils/ # Color utilities, headline rendering
│ └── dist/ # Production build (generated, hashed filenames)
│ └── .vite/manifest.json # Asset manifest for PHP resolution
├── templates/
│ ├── template-landing.php # Standalone HTML for landing pages (React mount)
│ └── template-legal.php # Server-rendered legal pages (no React)
├── docs/ # Additional documentation
├── .claude/agents/ # Claude Code specialized agents
│ ├── backend.md # @backend — PHP, REST API, WordPress
│ ├── frontend.md # @frontend — React, TypeScript, Vite, shadcn
│ ├── devops.md # @devops — Build, release, CI/CD
│ ├── reviewer.md # @reviewer — Code review, security, a11y
│ ├── marketing.md # @marketing — SEO, analytics, PPC tracking
│ └── design.md # @design — UI/UX, design system, WCAG
├── .config/ # Release & build scripts
│ ├── bump-version.sh # Auto-increment version (patch/minor/major)
│ ├── create-release.sh # Create a tagged release
│ └── build-zip.sh # Build local ZIP for manual upload
└── .github/workflows/
└── release.yml # GitHub Actions: build + release on tag push
Sections
| Section | Component | Editable Content |
|---|---|---|
| Header | Header.tsx |
Logo shape/color, fixed behavior, CTA button, Google Review badge |
| Topbar | Header.tsx (Topbar) |
Message, icon, phone/email visibility, gradient/bg image |
| Hero | Hero.tsx |
Headline, subheadline, badges, benefits, CTA, background image |
| Hero Form | HeroForm.tsx |
Form title, subtitle, button text, fields |
| Featured Testimonial | FeaturedTestimonial.tsx |
Quote, author, badge, CTA |
| Services | ServicesGrid.tsx |
Headline, services list (icon, title, description) |
| Mid-Page CTA | MidPageCTA.tsx |
Badge, headline, features list, CTA |
| Service Areas | ServiceAreas.tsx |
Headline, areas list (with highlights), CTA |
| Testimonials | TestimonialsGrid.tsx |
Headline, testimonials list (quote, author, rating) |
| FAQ | FAQ.tsx |
Headline, FAQ list (question/answer), contact card |
| Footer CTA | FooterCTA.tsx |
Headline, subheadline, CTA, reassurance text |
| Footer | Footer.tsx |
Description, copyright, social links, contact info |
REST API
Base URL: /wp-json/byrde/v1
| Method | Endpoint | Description | Auth | Rate Limit |
|---|---|---|---|---|
GET |
/pages/{id}/theme |
Get color/palette config | edit_post |
— |
PUT |
/pages/{id}/theme |
Save color/palette config | edit_post |
10/min |
GET |
/pages/{id}/content |
Get section content | edit_post |
— |
PUT |
/pages/{id}/content |
Save section content | edit_post |
10/min |
PUT |
/pages/{id}/save-all |
Atomic save (theme + content) | edit_post |
10/min |
GET |
/settings |
Get plugin settings | Public | — |
PUT |
/settings |
Update plugin settings | manage_options |
5/min |
POST |
/upload-image |
Upload an image | upload_files |
5/min |
POST |
/contact |
Submit contact form | Public | 10/5min (IP) |
POST |
/onboarding/complete |
Mark onboarding done | manage_options |
— |
All authenticated endpoints require the X-WP-Nonce header.
Development
Prerequisites
node -v # v20+
php -v # 8.0+
composer -V
Frontend Development
cd front-end
npm install
npm run dev # Vite dev server with HMR (open /editor.html for editor)
Production Build
cd front-end
npm run build # Outputs to front-end/dist/ (two entries: production + editor)
PHP Autoload
composer dump-autoload # Regenerate PSR-4 autoload after adding classes
Tests
cd front-end
npm test # Run all tests
npm run test:watch # Watch mode
npm run test:coverage # Coverage report
Releasing
Automated Release (via GitHub Actions)
# Bump patch version (1.1.0 → 1.1.1)
.config/bump-version.sh patch
# Bump minor version (1.1.0 → 1.2.0)
.config/bump-version.sh minor
# Bump major version (1.1.0 → 2.0.0)
.config/bump-version.sh major
# Or specify an exact version
.config/create-release.sh 2.0.0
This will:
- Update the version in
byrde.php(header + constant) - Commit and create an annotated git tag
- Push to GitHub
- GitHub Actions builds the frontend and packages the release ZIP
GitHub Releases are used for source-of-truth packaging only — they are not the update channel. To ship the update to live sites, upload the built ZIP and a matching metadata.json to updates.bluecrocus.ca (see below).
Manual ZIP + Metadata (for upload to the update server)
.config/build-zip.sh
# Output: ../byrde.zip + ../byrde-metadata.json
Then upload:
byrde.zip→https://updates.bluecrocus.ca/byrde/byrde-{VERSION}.zipbyrde-metadata.json→ overwritehttps://updates.bluecrocus.ca/byrde/metadata.json
Once metadata.json is live, sites running Byrde pick up the update on their next poll (or immediately via Check for updates).
How Auto-Updates Work
The plugin uses the Plugin Update Checker library (via Composer) against a self-hosted JSON metadata endpoint — not GitHub Releases/VCS. Byrde\Update\Checker registers the checker in Plugin::setup_update_checker().
- WordPress polls
https://updates.bluecrocus.ca/byrde/metadata.jsonevery ~12h (WP core's built-in update schedule), or immediately when the admin clicks Check for updates on the Plugins screen - If
metadata.jsonreports a newerversion, WordPress shows the same native update notice as wordpress.org-hosted plugins - The admin clicks Update now and WordPress downloads the ZIP from
download_urland installs it — one click, no manual upload
Metadata format
See docs/update-metadata.example.json. Fields: name, slug, version, download_url, homepage, requires, tested, requires_php, last_updated, sections.description, sections.changelog.
Overriding the metadata URL
By default the checker uses Constants::UPDATE_METADATA_URL. Override per-environment via, in order of precedence:
wp-config.phpconstant:define( 'BYRDE_UPDATE_METADATA_URL', 'https://example.com/byrde/metadata.json' );- Filter:
add_filter( 'byrde_update_metadata_url', fn () => 'https://example.com/byrde/metadata.json' );
If the resolved URL is empty, the checker is a no-op (no updates checked).
Security
- Input validation and sanitization on all REST endpoints
- Rate limiting per user (saves, uploads) and per IP (contact form)
- Content size limits (512KB theme config, 1MB content, 5MB images)
- Item count limits (50 services, 100 testimonials, 50 FAQs, 100 service areas)
- MIME type verification and dimension checks on file uploads (max 3840x2160)
- Nonce-based authentication for all admin endpoints
- Permission checks per page (
edit_postcapability) - Honeypot field on contact form
- XML-RPC disabled by default (
byrde_disable_xmlrpcfilter to override) - Asset isolation on landing pages (two-layer: dequeue + tag filter)
Claude Code Agents
The project includes 6 specialized Claude Code agents in .claude/agents/:
| Agent | Focus | Use For |
|---|---|---|
@backend |
PHP, REST API, WordPress | Classes, endpoints, validation, settings, CPT, migrations |
@frontend |
React, TypeScript, Vite | Components, hooks, contexts, color system, shadcn/ui |
@devops |
Build, release, CI/CD | GitHub Actions, Vite config, versioning, ZIP packaging |
@reviewer |
Code review, security | PR review, WCAG audit, performance check, code quality |
@marketing |
SEO, analytics, PPC | GA4/GTM tracking, attribution, JSON-LD, conversion setup |
@design |
UI/UX, design system | Visual quality, responsive, color system, accessibility |
18 agent skills are also installed (.agents/skills/) covering WordPress, React, shadcn/ui, analytics, PPC, debugging, design review, and MCP.
Read the full README on GitHub →
Releases
| Tag | Published | Asset | Downloads |
|---|---|---|---|
| v2.1.10 | Mar 25, 2026 | byrde.zip | 17 |
| v2.1.9 | Mar 5, 2026 | byrde.zip | 5 |
| v2.1.8 | Mar 4, 2026 | byrde.zip | 5 |
| v2.1.7 | Mar 4, 2026 | byrde.zip | 3 |
| v2.1.6 | Mar 4, 2026 | byrde.zip | 1 |
| v2.1.5 | Mar 4, 2026 | byrde.zip | 1 |
| v2.1.4 | Mar 4, 2026 | byrde.zip | 1 |
| v2.1.3 | Mar 4, 2026 | byrde.zip | 2 |
| v2.1.2 | Mar 4, 2026 | byrde.zip | 8 |
| v2.1.1 | Mar 4, 2026 | byrde.zip | 2 |
| v2.1.0 | Mar 4, 2026 | byrde.zip | 2 |
| v2.0.8 | Mar 4, 2026 | byrde.zip | 3 |
| v2.0.7 | Mar 2, 2026 | byrde.zip | 3 |
| v2.0.6 | Mar 2, 2026 | byrde.zip | 1 |
| v2.0.5 | Mar 2, 2026 | byrde.zip | 3 |
| v2.0.4 | Mar 2, 2026 | byrde.zip | 3 |
| v2.0.3 | Mar 2, 2026 | byrde.zip | 1 |
| v2.0.2 | Mar 2, 2026 | byrde.zip | 0 |
| v2.0.1 | Mar 1, 2026 | byrde.zip | 4 |
| v2.0.0 | Mar 1, 2026 | byrde.zip | 2 |
| v1.3.1 | Feb 27, 2026 | byrde.zip | 2 |
| v1.3.0 | Feb 27, 2026 | byrde.zip | 0 |
| v1.2.0 | Feb 27, 2026 | byrde.zip | 4 |
| v1.1.3 | Feb 25, 2026 | byrde.zip | 5 |
| v1.1.2 | Feb 25, 2026 | byrde.zip | 1 |