Session Handoff — Programs SEO & Architecture
Use this file to resume work on the Baseworks programs page architecture and Spring 2026 cohort launch.
How to start the new session
Section titled “How to start the new session”In Claude Code (terminal):
Read ~/Documents/baseworks-changelog/CLAUDE-INSTRUCTIONS.mdThen reference this file and the full notes below.
SSH access:
ssh bwsite_primo_82@5.180.253.171WP path: /var/www/baseworks.comFull session notes
Section titled “Full session notes”All decisions, architecture, and to-do list from the Feb 24 session are documented here:
~/Obsidian/baseworks-kb-shared-brain/02-areas/website/seo-architecture-session-2026-02-24.mdRead that file first before starting any work. It contains the full architecture diagram, redirect rules, schema strategy, and the phased to-do list.
Context: what was decided (quick reference)
Section titled “Context: what was decided (quick reference)”Program naming: Staying with Study Group (no rename). The format pair is:
- Baseworks Study Group — multi-week cohort (7 sessions over 7 weeks)
- Baseworks Lab — intensive format (dropped “Study” from “Study Lab”)
Target hub URL: /programs/montreal-study-group/
Currently ranking at: /montreal-study-program/ (Page ID 33521) — do not touch this URL until the URL restructuring phase (see to-do list).
Spring 2026 cohort:
- Dates: April 4 – May 16, 2026 (7 Saturdays)
- Location: Proto Studio, Montreal
- Price + enrollment cap: still TBD — must be set before any pages go live
- Obsidian notes: Spring 2026 Study Group Montreal
What needs to happen next (in priority order)
Section titled “What needs to happen next (in priority order)”1. Immediate — before campaign launches
Section titled “1. Immediate — before campaign launches”- Finalize Spring 2026 price and enrollment cap
- Update
/montreal-study-program/content to function as a hub (upcoming cohort prominent, links to past events) - Create Spring 2026 event post (
/event/montreal-study-group-spring-2026/) with Event schema - Create campaign landing pages — EN + FR versions, noindexed, canonical → event post
2. Short-term — after campaign is live
Section titled “2. Short-term — after campaign is live”- Finish and publish Study Lab Landing draft (Page ID 36638)
- Update
/programs/page (ID 28338) to link to Montreal Study Group hub + Study Lab hub
3. Medium-term — URL restructuring
Section titled “3. Medium-term — URL restructuring”- Change slug
montreal-study-program→montreal-study-groupAND set parent toprograms(ID 28338) in ONE save - Verify redirect in SEOPress:
/montreal-study-program/→301→/programs/montreal-study-group/(single hop) - Clean up duplicate pages (all 301 directly to
/programs/montreal-study-group/):/smart-movement-mtl-2025/(ID 34474)/smart-movement-study-program-mtl-2025/(ID 34739)/smart-movement-study-program-2026/(ID 44805)/smsg-2026/(ID 44851)
- Add breadcrumb Schema to Montreal Study Group event posts via SEOPress
- Submit updated sitemap in Google Search Console
Key files to know
Section titled “Key files to know”| File | What it is |
|---|---|
~/Documents/baseworks-changelog/CLAUDE-INSTRUCTIONS.md | Always read at session start |
~/Documents/baseworks-changelog/CHANGELOG.md | Log all site changes here |
~/Documents/baseworks-changelog/docs/SEO-PLUGIN-MIGRATION-PLAN.md | SEOPress migration plan (in progress) |
~/Obsidian/baseworks-kb-shared-brain/02-areas/website/seo-architecture-session-2026-02-24.md | Full session notes from Feb 24 |
~/Obsidian/baseworks-kb-shared-brain/02-areas/educational-programs/educational-programs.md | Programs overview |
~/Obsidian/baseworks-kb-shared-brain/02-areas/educational-programs/study-groups/2026 (Spring) Study Group Montreal/ | Spring 2026 cohort notes |
Site structure quick reference
Section titled “Site structure quick reference”baseworks.com — main site (this session's focus)practice.baseworks.com — learning platform (separate, not in scope here)staging.baseworks.com — test changes here before productionSEO plugin: SEOPress PRO (migrated from Slim SEO — see migration plan doc above) Page builder: Elementor Multilingual: WPML (EN + JA — French is NOT a full site language)
Programs Hub page — deployed 2026-02-28
Section titled “Programs Hub page — deployed 2026-02-28”The /programs/ page (ID 28338) is now live using a custom PHP page template.
Template file:
~/files/wp-content/themes/kadence/template-programs-hub.php(also tracked at sites/baseworks.com/theme-overrides/template-programs-hub.php in the changelog repo)
To revert: WP Admin → Pages → Programs (ID 28338) → Page Attributes → Template → Default
Technical notes — implementing PHP page templates on this site
Section titled “Technical notes — implementing PHP page templates on this site”Things that tripped us up during deployment. Keep these in mind for any future custom PHP templates.
1. Kadence namespace — always use \Kadence\kadence()
Section titled “1. Kadence namespace — always use \Kadence\kadence()”Kadence’s helper function is declared inside namespace Kadence;. Custom page templates do not inherit that namespace. Calling kadence() from a template without a namespace declaration causes a fatal PHP error — the page goes blank with no output after the header.
Always use the fully qualified call:
\Kadence\kadence()->print_styles( 'kadence-content' );2. Design tokens are not in Kadence core — include them in the template
Section titled “2. Design tokens are not in Kadence core — include them in the template”The site’s CSS variables (--color-bg-dark, --color-primary, --font-display, --font-accent, --space-*, etc.) and utility classes (.container, .section, .btn) live in baseworks-tokens.css — a mockup-only file. They are not part of Kadence’s theme CSS.
Custom page templates bypass Elementor entirely, so these tokens are not loaded. The fix: copy the full :root {} token block and utility classes directly into the template’s <style> block.
Reference file: sites/baseworks.com/mockups/baseworks-tokens.css
3. Scope your CSS with a wrapper class
Section titled “3. Scope your CSS with a wrapper class”Adding a wrapper <div class="programs-hub"> around all content lets you scope utility classes (.container, .section, .btn) without risking conflicts with Kadence’s own CSS that uses similar class names. Use .programs-hub .container { ... } etc.
4. Page template is in the parent Kadence theme (no child theme)
Section titled “4. Page template is in the parent Kadence theme (no child theme)”There is no child theme on baseworks.com — only the parent Kadence theme. Templates go directly in:
~/files/wp-content/themes/kadence/Kadence updates do not overwrite custom files you add. Only files that ship with Kadence (like page.php) would be overwritten by an update — custom templates with unique filenames are safe.
5. SSH path
Section titled “5. SSH path”The web root for bwsite_primo_82 is ~/files/ (not /var/www/baseworks.com/ directly — that’s the system path used in PHP error logs). Upload files to:
~/files/wp-content/themes/kadence/6. Cache: PHP file changes require a manual purge
Section titled “6. Cache: PHP file changes require a manual purge”Deploying or editing a PHP template file on disk does NOT trigger any WordPress cache hook. Neither cloudflare-auto-purge.php nor the elementor-css-cache-handler.php mu-plugin will fire — those only respond to WP events (post saves, Elementor flushes, etc.).
After any SSH file change (template edits, mu-plugin changes, etc.) you must run the full purge manually:
cd /var/www/baseworks.com
# 1. Rediswp cache flush
# 2. nginx FastCGI (owned by bwsite_primo_82 — no sudo needed)rm -rf /etc/nginx/cache/baseworks.com/*
# 3. CloudflareCF_EMAIL='accounts@baseworks.com'CF_KEY='149706d4a2297dcb049f2d1f64848138e2bf1'ZONE_ID='98842cf61429901d7e7214e3cb71f6db'curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/purge_cache" \ -H "X-Auth-Email: $CF_EMAIL" \ -H "X-Auth-Key: $CF_KEY" \ -H 'Content-Type: application/json' \ --data '{"purge_everything":true}'
# 4. Warm the page (so nginx rebuilds cache from fresh PHP render)curl -s -o /dev/null -w '%{http_code}' --resolve baseworks.com:443:127.0.0.1 -k https://baseworks.com/programs/Symptom when forgotten: Cloudflare shows cf-cache-status: MISS (already cleared) but x-cache: HIT (nginx still serving old content). The nginx cache file timestamp predates the file change.
Quick diagnosis:
# Find the nginx cache file for /programs/find /etc/nginx/cache/baseworks.com -type f | while read f; do key=$(head -c 300 "$f" 2>/dev/null | grep -a 'KEY:' | head -1) echo "$key" | grep -q 'programs' && ls -la "$f"doneCompare the cache file timestamp to when you last modified the template.