A comprehensive approach to help marriages thrive.
A comprehensive approach to help marriages thrive.
DUO.bz — Inventory & Salvage Audit
Prepared by Revenue | 2026-08-08 | Purpose: inventory + salvage for Duo 2.0 (NOT migration)
Raw data bundle: `duo-audit/` in this workspace (JSON dumps + extracted app sources)
—
0. Executive Summary
The single most important finding: duo.bz is not a “WordPress site with content.” It is ~20 hand-built custom React apps living inside WordPress pages (via the ReactPress plugin, Blocksy theme, Breeze cache). Every pillar page, every lesson, every hub, and the Compass diagnostic is a bespoke JavaScript application embedded in a WP page. The WordPress layer is mostly a shell: hosting, login, WooCommerce checkout, and Paid Member Subscriptions gating.
Implications for Duo 2.0:
The *content* is almost entirely structured data + copy inside these apps — it is fully extractable (done, see data bundle) and maps directly onto Duo 2.0’s learning/journey model.
The *app logic* (Compass scoring, routing, capacity check, 28-day engine) is the real salvageable IP — and it’s client-side, so the complete source is in hand.
The *WordPress plumbing* (WooCommerce, member subscriptions, register flow) is business-data migration, not UI migration — exactly as Marcus predicted.
**Do not port pages. Extract and classify.** The classification matrix is in §4.
—
1. Site Stack
Hosting
Hetzner, IP 46.224.213.11 (same box as Mightymax image library), Apache/Ubuntu, HTTPS
CMS
WordPress + Blocksy theme (Blocksy Companion)
React-in-WP
**ReactPress** plugin (embeds React apps in pages), CDN React 18 + Babel standalone + Tailwind CDN (no build step — browser compiles JSX at runtime)
**Paid Member Subscriptions** — gates the 28 Days program
Other plugins
Jetpack (Protect, forms, payments), Breeze cache, Google Site Kit, Kadence Blocks, Klaviyo, GenerateBlocks
Mail
Zoho (MX)
DNS
GoDaddy nameservers
Auth
WP login protected by Jetpack Protect math captcha; stored creds (DUOBZ_WP_*) exist but REST app-passwords not configured
Front-end pattern: each page = Custom HTML block containing a full React app (JSX compiled in-browser via Babel). Styling is bespoke (cream/gold “DUO” design system on the Compass; “DUO VIBRANT” navy/emerald system on the homepage). No shared component library — each app is self-contained and copy-pasted (multiple versions of the same app exist across pages/posts).
—
2. Full Inventory
2.1 Pages (21 published) — roles
Marketing / funnel
`home-3` (/) — custom landing page: “Join the Twenty-Three”, 23% stat, 4 pillars, Compass CTA, 28-Day CTA, book block, science+faith, social proof. 18 section headings.
`pillars` — “Four Pillars. One System.” framework explorer app.
`book` (URL /book/, not in page API list — WooCommerce product page) — book sales page.
`28days` — hub page, **member-gated** (“available to DUO members only”).
`28d` — the 28 Days program app (75K) — full curriculum engine.
Commerce / account
`shop`, `cart`, `checkout`, `my-account`, `login` (login-4), `register` — standard WooCommerce + custom register form with subscription.
Legacy
`28d` (id 2826, “28 Days – done”) — old program version (79K) — **retire candidate**.
2.2 The custom React apps — functional fingerprint
`co2` Compass
68K
12-dimension diagnostic, partner A/B, zones, flight plan (§2.4)
`28d`
75K
28-day program engine: 28 sections, prep/shared/carry steps, pace options (Daily/Weeks), progress in localStorage (§2.5)
`fu2` Fundamentals Router
63K
“Where Does It Hurt?” routing — Module Boundary Map, diagnostics, pattern matching, module integrity
`fh2` / `fh2-2` / `co21` / `co2-3` / `rt2`
92–152K
Pillar content hubs: entries with Definition / Why it matters / Signs you’re in this / Try this next / Go deeper / Safety Valve / Faith Layer / Practical Application + “Retake Diagnostic”
Small chart widget (Compass Rose radar) on the landing page
Key structural insight: lessons and hubs share one recurring interaction pattern (symptom → route → structured content with a “practice” step). This is directly reusable as the Duo 2.0 learning-component pattern.
2.3 Posts (67) — the content library
Categories: Foundations 22, Connection 17, Household 19, Assessment Tools 4, Repair 0 (empty), Private 0 public (exists), Layouts 0. 6 posts uncategorized (legacy 28-days prototype content: Starting Point, The Inner, The Outer, The Repair, The Background, The Design, The Repair Process).
Most posts are the interactive lesson apps (§2.2). Notable titles: The Season of Survival, The Division of Power, The Mental Load, The Forgiveness Baseline, Negative Sentiment Override, Rupture & Return, Bids: The Small Reaches, The Flooding Protocol, The Exhumation Protocol, The Death of Warmth, Neuroception: Your Body’s Scanner, The Consumer vs. The Covenant, Values Alignment vs. Collision, The Six Hours That Save a Marriage, The Financial Blueprint, Legacy & Shared Meaning, Trajectory, The Mission, The Discovery, Compass.
The 67 posts = the durable learning-content inventory (titles + full structured content in the data bundle).
Each dimension: 1 question, 3–5 options (values +10…−10 with labels + descriptions), 3 ranges (Strong / Developing / Critical) each with **insight copy + action list**, optional urgency flag and skipIfNoKids logic (Parenting).
**Scoring:** both partners answer (Partner A/B); score = avg of both / max possible → percentage.
**4 zones:** Flourishing ≥80 (“The Eight”), Growth ≥60 (“The Solid Fifteen”), Stability ≥40 (“The Broader Twenty-Three”), Restoration <40 ("The Seventy-Seven") — each with color + positioning copy. (The "Twenty-Three" brand name derives from the Stability zone / 23% stat.)
**Delta Detector:** top-4 dimension gaps between partners (routed to priority dims).
**Flight Plan:** 3 priority tracks — (1) Structural Damage (trust/safety <3: "stop here, stabilize first"), (2) The Drift / roommate-phase (presence), (3) The Stall (operational dims) — each with rootCause copy, **timeframe** (e.g. "Weeks 1–8: Stabilize. Months 3–6: Rebuild"), primary module routes (name/url/desc) and secondary routes, plus legacy projection.
**Outputs:** Compass Rose radar chart, Top 3 Growth Priorities, Category breakdown, Resource Map → lesson URLs.
**Resource URLs are partially broken:** `URLS` map points to short URLs (duo.bz/f, /t, /co, /s…) that resolve to empty pages — the Compass’s “go deeper” links mostly lead nowhere. Fix or replace in 2.0.
2.5 The 28 Days program (fully extracted — `sections28.json` + app source)
28 sections, 4 phases (Foundation → Structure → Transformation → Sustainability), two paces (Daily(28) / Weeks), each section = prep / shared / carry steps, with: Warm start, “What this looks like in real life”, “Why this works”, Action plan, Expected shift, “If this feels hard”, Common stuck point, Course correction, Progress tracking (localStorage), sprint review, “Reset (local)”.
The 28 sections:
1. The Brutal Assessment 2. Identify Your Pattern 3. Stop the Bleeding 4. Clear the Toxins 5. Build the Emotional Bank Account 6. The Weekly Meeting 7. Week 1 Debrief 8. The Invisible Load Audit 9. The Domain Division 10. The First Failure 11. Weekly Meeting 2.0 12. The Stress Spillover Protocol 13. The Parenting Partnership 14. Week 2 Review 15. Drop the Rock 16. Close the Ledger 17. Soften Your Startup 18. The Art of Repair 19. Rebuild Trust 20. Cultivate Hope 21. Week 3 Review 22. Build the Daily Rituals 23. Quarterly Tune-Ups 24. The Relapse Plan 25. Date Night Discipline 26. The Long Obedience 27. The Celebration 28. The Fortress of Joy
Salvage verdict: the rigid “28 days” container is likely wrong for a subscription, but every exercise/prompt/structure is a building block for personalized journeys (see §4).
2.6 Lesson app pattern (e.g. `ss1` — The Season of Survival)
Hook question (“Why does the crisis feel like it’s breaking you?”) → “Pick the symptom that describes your current survival season” → routing → sections: The hard part / In practice / Script / Apply this / Common mistake / Your notes + solo-spouse handling (“If your spouse won’t engage with this” → what to do solo / what to avoid) + The Capacity Check (90/10): each partner declares battery % (self + guessed partner %) — a clever, reusable couples-regulation tool.
2.7 Commerce & subscriptions
**1 WooCommerce product:** “DUO: Enjoying Life Together” — $9.90 regular / **$7.90 sale** (USD), simple product, custom long-description tables (feature comparison). Sold via WooPayments (Stripe). Short copy: “The relationship you want is still possible…”
**Subscription:** register form bundles **”28 Days Plan — $19 / 1 month, auto-renew”** with payment details (Paid Member Subscriptions). This is the gating + recurring revenue mechanism.
The book itself: *DUO: Enjoying Life Together* (Amazon Kindle/paperback per strategy docs; full-color PDF copy exists in the media library).
2.8 Membership & accounts
Paid Member Subscriptions gates `/28days/` (and `/28d/`). Login/register pages custom. **Note:** the 28d app source is served publicly via REST (client-side gate only) — member content exposure risk to flag for 2.0 (server-side gating required).
2.9 Media (129 items)
~38 current (2025–26): book cover, **full-color book PDF** (“DUO Enjoying Life Together – In Color”), duo logo, avatar, 11 infographic-style images (572×1024, named 1–8 + variants), ~25 stock photos (Pexels/Canva).
Register (username/email/password + subscription payment), Login, WooCommerce checkout/cart. Klaviyo present in plugin stack (newsletter). No contact form found. Compass/lesson apps capture data in localStorage only (no backend sync) — progress is device-local, a key 2.0 opportunity.
—
3. Risks & Technical Debt (for the team)
1. No build step: React apps compiled in-browser via Babel CDN — slow, fragile, no asset pipeline. Rebuild (not port) in 2.0.
2. Copy-paste sprawl: multiple divergent versions of the same app (Compass in co2/co2-3/compass post; hubs; old 28d) — content has forked. The audit captured the current state; 2.0 must have a single source of truth.
3. Broken resource links (Compass → short URLs render empty).
4. Client-side gating on member content (REST exposes app source publicly).
5. Data silo: all progress/answers in localStorage — no accounts-based state, no cross-device, no analytics.
6. Legacy cruft: 91 old media files, uncategorized prototype posts, “28 Days – done” page.
7. Login friction: Jetpack Protect captcha blocks even legitimate logins (we could not reach wp-admin; REST app passwords not configured). If the team needs wp-admin access, create an application password (or whitelist IP).
—
4. Classification Matrix (per Marcus’s 5 buckets)
🔒 KEEP AS-IS (strong copy/assets, port verbatim)
Compass dimension questions + option labels/descriptions (all 12 dims — the language is the product)
Zone names + positioning copy (“The Twenty-Three”, “The Eight”, “The Solid Fifteen”, “The Seventy-Seven”, Restoration/Growth/Stability/Flourishing)
Root-cause + timeframe copy for the 3 priority tracks
*New* — but ground it in the existing diagnostic language (dimension insights, root-cause copy, course-correction patterns from 28d)
**Progress / Check-ins**
28d progress model (done-state, notes, course correction, sprint review, reset) → make it account-backed
**Next Recommendation**
Flight plan routing + fu2 router + delta-based priorities
Commerce mapping: WooCommerce book product → pricing/entitlement table; 28 Days Plan $19/mo (PMS) → Duo subscription tiers; WooPayments → Stripe. (Business-data migration, as Marcus said.)
(function(){
if(window.__duoEmailInit)return;
window.__duoEmailInit=true;
var U="https://afgmlkduuapquqkcqdsk.supabase.co";
var K="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImFmZ21sa2R1dWFwcXVxa2NxZHNrIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzgzNDA2NzYsImV4cCI6MjA5MzkxNjY3Nn0.-WQ34Jxy9CmI-SsQfcMNWPZi5AfZCzv9jZHDQ6ccEWc";
async function s(f,sr){
var e=f.querySelector("input[type=email]"),n=f.querySelector("input[name=duo_name]"),m=f.querySelector(".duo-msg"),b=f.querySelector("button"),em=e.value.trim(),nm=n?n.value.trim():"";
if(!em||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(em)){if(m){m.textContent="Please enter a valid email.";m.style.display="block";m.style.color="#ef4444";}return;}
if(b){b.disabled=true;if(!b.getAttribute("data-original"))b.setAttribute("data-original",b.textContent);b.textContent="Subscribing...";}
try{
var r=await fetch(U+"/rest/v1/duo_subscribers",{method:"POST",headers:{"Content-Type":"application/json",apikey:K,Authorization:"Bearer "+K},body:JSON.stringify({email:em,name:nm||null,source:sr})});
if(r.ok){if(m){m.textContent="✓ Welcome to DUO!";m.style.display="block";m.style.color="#22c55e";}if(e)e.value="";if(n)n.value="";}
else{var er=await r.json();if(er.code==="23505"){if(m){m.textContent="Already subscribed!";m.style.display="block";m.style.color="#22c55e";}}else{throw new Error(er.message||"Error");}}
}catch(err){if(m){m.textContent=err.message||"Please try again.";m.style.display="block";m.style.color="#ef4444";}}
finally{if(b){b.disabled=false;b.textContent=b.getAttribute("data-original")||"Subscribe";}}
}
document.addEventListener("DOMContentLoaded",function(){
document.querySelectorAll(".duo-email-form").forEach(function(f){
var sr=f.getAttribute("data-duo-source")||"website";
f.addEventListener("submit",function(e){e.preventDefault();s(f,sr);});
});
var ov=document.getElementById("duo-popup-overlay");
if(ov&&!sessionStorage.getItem("duo_popup_shown")){
setTimeout(function(){ov.style.display="flex";sessionStorage.setItem("duo_popup_shown","1");},8000);
}
var cb=document.getElementById("duo-popup-close");
if(cb){cb.addEventListener("click",function(){document.getElementById("duo-popup-overlay").style.display="none";});}
if(ov){ov.addEventListener("click",function(e){if(e.target===ov)ov.style.display="none";});}
});
})();
(function() {
window.wcAnalytics = window.wcAnalytics || {};
const wcAnalytics = window.wcAnalytics;// Set the assets URL for webpack to find the split assets.
wcAnalytics.assets_url = 'https://duo.bz/wp-content/plugins/jetpack/jetpack_vendor/automattic/woocommerce-analytics/src/../build/';// Set the REST API tracking endpoint URL.
wcAnalytics.trackEndpoint = "https://duo.bz/wp-json/woocommerce-analytics/v1/track";// Set common properties for all events.
wcAnalytics.commonProps = {"session_id":null,"landing_page":null,"is_engaged":null,"ui":0,"blog_id":252820655,"store_id":"4735d1d5-c7ab-4559-898b-2f4ef0eaef06","url":"https://duo.bz","woo_version":"10.6.1","wp_version":"7.0.3","store_admin":0,"device":"desktop","store_currency":"USD","timezone":"+00:00","is_guest":1,"_via_ua":"Mozilla/5.0 (compatible; AhrefsBot/7.0; +http://ahrefs.com/robot/)","_via_ip":"198.244.242.19","_lg":"","_dr":"","_dl":"https://duo.bz/duo-site-audit/","_via_ref":""};// Set the event queue.
wcAnalytics.eventQueue = [];// Features.
wcAnalytics.features = {
ch: false,
sessionTracking: false,
proxy: false,
};wcAnalytics.breadcrumbs = ["DUO Site Audit (2026-08-08)"];// Page context flags.
wcAnalytics.pages = {
isAccountPage: false,
isCart: false,
};
})();
(function(){
if(window.__duoEmailInit)return;
window.__duoEmailInit=true;
var U="https://afgmlkduuapquqkcqdsk.supabase.co";
var K="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImFmZ21sa2R1dWFwcXVxa2NxZHNrIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzgzNDA2NzYsImV4cCI6MjA5MzkxNjY3Nn0.-WQ34Jxy9CmI-SsQfcMNWPZi5AfZCzv9jZHDQ6ccEWc";
async function s(f,sr){
var e=f.querySelector("input[type=email]"),n=f.querySelector("input[name=duo_name]"),m=f.querySelector(".duo-msg"),b=f.querySelector("button"),em=e.value.trim(),nm=n?n.value.trim():"";
if(!em||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(em)){if(m){m.textContent="Please enter a valid email.";m.style.display="block";m.style.color="#ef4444";}return;}
if(b){b.disabled=true;if(!b.getAttribute("data-original"))b.setAttribute("data-original",b.textContent);b.textContent="Subscribing...";}
try{
var r=await fetch(U+"/rest/v1/duo_subscribers",{method:"POST",headers:{"Content-Type":"application/json",apikey:K,Authorization:"Bearer "+K},body:JSON.stringify({email:em,name:nm||null,source:sr})});
if(r.ok){if(m){m.textContent="✓ Welcome to DUO!";m.style.display="block";m.style.color="#22c55e";}if(e)e.value="";if(n)n.value="";}
else{var er=await r.json();if(er.code==="23505"){if(m){m.textContent="Already subscribed!";m.style.display="block";m.style.color="#22c55e";}}else{throw new Error(er.message||"Error");}}
}catch(err){if(m){m.textContent=err.message||"Please try again.";m.style.display="block";m.style.color="#ef4444";}}
finally{if(b){b.disabled=false;b.textContent=b.getAttribute("data-original")||"Subscribe";}}
}
document.addEventListener("DOMContentLoaded",function(){
document.querySelectorAll(".duo-email-form").forEach(function(f){
var sr=f.getAttribute("data-duo-source")||"website";
f.addEventListener("submit",function(e){e.preventDefault();s(f,sr);});
});
var ov=document.getElementById("duo-popup-overlay");
if(ov&&!sessionStorage.getItem("duo_popup_shown")){
setTimeout(function(){ov.style.display="flex";sessionStorage.setItem("duo_popup_shown","1");},8000);
}
var cb=document.getElementById("duo-popup-close");
if(cb){cb.addEventListener("click",function(){document.getElementById("duo-popup-overlay").style.display="none";});}
if(ov){ov.addEventListener("click",function(e){if(e.target===ov)ov.style.display="none";});}
});
})();