[object Object]

← back to Cf Dns Migration

CF DNS migration: Phase-0 inventory (286 domains classified) + idempotent stage.py replication engine (GoDaddy records → CF zone, structural guards, dry-run proven)

cf3dacbb76180807b18beb463f7fa7a26bf765fb · 2026-07-22 21:32:20 -0700 · Steve

Files touched

Diff

commit cf3dacbb76180807b18beb463f7fa7a26bf765fb
Author: Steve <steve@designerwallcoverings.com>
Date:   Wed Jul 22 21:32:20 2026 -0700

    CF DNS migration: Phase-0 inventory (286 domains classified) + idempotent stage.py replication engine (GoDaddy records → CF zone, structural guards, dry-run proven)
---
 .gitignore     |   6 ++
 README.md      |  49 ++++++++++
 classified.csv | 287 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 stage.py       | 194 ++++++++++++++++++++++++++++++++++++++
 worklist.csv   | 242 ++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 778 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c8cf16a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+node_modules/
+.env*
+tmp/
+*.log
+.DS_Store
+staged-*.csv
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..cd8700c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,49 @@
+# CF DNS migration
+
+Move the DNS *management* of Steve's actively-used GoDaddy domains to Cloudflare
+(domains stay **registered** at GoDaddy) so DNS + email become API-manageable.
+GoDaddy retired the write side of its public API for this account, so it can only
+be managed by hand in the dashboard today.
+
+## Why
+286 domains at GoDaddy, write-blocked API. Phase-0 inventory (`classified.csv`):
+- **LIVE+EMAIL 193 · LIVE_SITE 52 · ON_CF 39 · EMAIL_ONLY 2** (nothing fully parked)
+- Email: Purelymail 196 · **Google Workspace 5 (EXCLUDE)** · GoDaddy 2
+- NS: GoDaddy 243 · Cloudflare 39
+
+`worklist.csv` = the 241 GoDaddy-NS migration candidates (Workspace auto-excluded).
+
+## ⚠️ Hard exclusions (never touch MX — Google Workspace)
+`designerwallcoverings.com`, `studentdebtcrisis.com/.org`, `studentdebtcrisiscenter.com/.org`
+
+## The one manual step
+The **NS-swap is GoDaddy-dashboard-only** (unlock the domain, set nameservers to the
+per-zone pair CF assigns). Everything else is automated. Staging a CF zone is **safe
+and dormant** — the domain keeps its GoDaddy nameservers until the swap, so a staged
+zone changes nothing live. Cutover is then instant + lossless because the zone is
+already a faithful copy.
+
+## Tool — `stage.py`
+Reads each domain's LIVE GoDaddy records → ensures a CF zone → replicates records
+**idempotently**, DNS-only (grey cloud, mirrors GoDaddy exactly). Structural guards
+never create an invalid zone (CNAME-alone rule, DMARC/SPF singletons), so it's safe
+to re-run and safe against already-curated zones.
+
+```
+python3 stage.py --dry-run homesonspec.com        # preview (no writes) — DEFAULT SAFE
+python3 stage.py --from worklist.csv --limit 5     # LIVE-stage first 5 (gated)
+python3 stage.py <domain> ...                      # LIVE-stage named domains (gated)
+```
+Never copies NS/SOA or GoDaddy's proprietary `_domainconnect`. Emits
+`staged-nameservers.csv` = the NS-swap worklist (each domain → its CF nameservers).
+
+## Runbook
+1. **Phase 0** — done (`classified.csv`, `worklist.csv`).
+2. **Phase 1 pilot — homesonspec.com**: zone already fully staged (dry-run = +0). Only
+   the GoDaddy NS-swap remains → then `purelymail_add_domain` + `info@` routing rule.
+3. **Phase 2** — `stage.py --from worklist.csv` (batches), then bulk NS-swap per batch
+   in the GoDaddy dashboard from `staged-nameservers.csv`.
+4. **Phase 3** — verify + SSL + a drift canary.
+
+**Gating:** live staging (CF zone/record writes) and every NS-swap are DNS changes →
+Steve-approved, run with named domains. Dry-run is always safe.
diff --git a/classified.csv b/classified.csv
new file mode 100644
index 0000000..a059ff7
--- /dev/null
+++ b/classified.csv
@@ -0,0 +1,287 @@
+domain,ns,has_a,mx,bucket
+1890swallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+800wallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+1930swallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+1800wallpapers.com,godaddy,yes,purelymail,LIVE+EMAIL
+abramscivic.com,cloudflare,yes,none,ON_CF
+1980swallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+aaatreetrimming.com,godaddy,yes,purelymail,LIVE+EMAIL
+1960swallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+1800wallcoverings.com,godaddy,yes,purelymail,LIVE+EMAIL
+90210rentals.com,godaddy,yes,none,LIVE_SITE
+1920swallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+67calc.com,godaddy,yes,purelymail,LIVE+EMAIL
+abramsatlas.com,cloudflare,yes,none,ON_CF
+abramsindustries.com,cloudflare,yes,none,ON_CF
+1940swallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+abramsindex.com,cloudflare,yes,none,ON_CF
+1970swallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+818butler.com,cloudflare,yes,none,ON_CF
+1950swallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+1900swallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+1800swallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+abramsdirectory.com,cloudflare,yes,none,ON_CF
+abramsintel.com,cloudflare,yes,none,ON_CF
+abramsintelligence.com,cloudflare,yes,none,ON_CF
+abramslocal.com,cloudflare,yes,none,ON_CF
+abramsguide.com,cloudflare,yes,none,ON_CF
+abramsos.com,cloudflare,yes,none,ON_CF
+abramsmaps.com,cloudflare,yes,none,ON_CF
+abramsmarkets.com,cloudflare,yes,none,ON_CF
+allnewsdaily.com,godaddy,yes,none,LIVE_SITE
+apartmentwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+asknonna.ai,godaddy,yes,purelymail,LIVE+EMAIL
+abramslive.com,cloudflare,yes,none,ON_CF
+askgoodquestions.ai,godaddy,yes,purelymail,LIVE+EMAIL
+abramsvc.com,cloudflare,yes,none,ON_CF
+barwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+abramsspace.com,cloudflare,yes,none,ON_CF
+asseeninmovies.com,godaddy,yes,purelymail,LIVE+EMAIL
+agentabrams.com,cloudflare,yes,purelymail,ON_CF
+asseeninshowrooms.com,godaddy,yes,purelymail,LIVE+EMAIL
+agedwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+architecturalwallcoverings.com,godaddy,yes,purelymail,LIVE+EMAIL
+bestactorawards.com,godaddy,yes,none,LIVE_SITE
+bestdocumentaryfilms.com,godaddy,yes,none,LIVE_SITE
+bestwallpaperplace.com,godaddy,yes,purelymail,LIVE+EMAIL
+beverlyandhills.com,godaddy,yes,purelymail,LIVE+EMAIL
+beverlyhillspaints.com,godaddy,yes,purelymail,LIVE+EMAIL
+blockprintedwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+bubbie.ai,godaddy,yes,purelymail,LIVE+EMAIL
+beverlyhillsbutler.com,cloudflare,yes,none,ON_CF
+borrowerbills.org,godaddy,yes,purelymail,LIVE+EMAIL
+bleachfriendly.com,godaddy,yes,purelymail,LIVE+EMAIL
+boulevardbutler.com,cloudflare,yes,none,ON_CF
+bubbeleh.ai,godaddy,yes,purelymail,LIVE+EMAIL
+borninbh.com,godaddy,yes,purelymail,LIVE+EMAIL
+bubbesblock.com,godaddy,yes,none,LIVE_SITE
+boomercalc.com,cloudflare,yes,none,ON_CF
+cannabisofthemonthclub.com,godaddy,yes,none,LIVE_SITE
+blankstocklining.com,godaddy,yes,purelymail,LIVE+EMAIL
+carmelriverwater.com,godaddy,yes,purelymail,LIVE+EMAIL
+abramsprotection.com,cloudflare,yes,none,ON_CF
+carmelpaints.com,godaddy,yes,purelymail,LIVE+EMAIL
+abramsterminal.com,cloudflare,yes,none,ON_CF
+asseeninhotels.com,godaddy,yes,purelymail,LIVE+EMAIL
+asseeninla.com,godaddy,yes,purelymail,LIVE+EMAIL
+carmelvalleywater.com,godaddy,yes,purelymail,LIVE+EMAIL
+carmelwallpapers.com,godaddy,yes,purelymail,LIVE+EMAIL
+cfafabrics.com,godaddy,yes,purelymail,LIVE+EMAIL
+carmelwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+classawallcovering.com,godaddy,yes,purelymail,LIVE+EMAIL
+chinoiseriewallpaper.com,godaddy,yes,none,LIVE_SITE
+commercialdesignreps.com,godaddy,yes,none,LIVE_SITE
+claimmyaddress.com,godaddy,yes,none,LIVE_SITE
+cleaninggrants.com,godaddy,yes,none,LIVE_SITE
+contractwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+corkwallcovering.com,godaddy,yes,purelymail,LIVE+EMAIL
+cleaninggrants.org,godaddy,yes,none,LIVE_SITE
+customdigitalmurals.com,godaddy,yes,purelymail,LIVE+EMAIL
+commercialsalesreps.com,godaddy,yes,purelymail,LIVE+EMAIL
+cypresawards.com,cloudflare,yes,none,ON_CF
+customdigitalwallcoverings.com,godaddy,yes,purelymail,LIVE+EMAIL
+commercialwalls.com,godaddy,yes,purelymail,LIVE+EMAIL
+bhbutler.com,cloudflare,yes,none,ON_CF
+cypresawards.org,godaddy,yes,purelymail,LIVE+EMAIL
+designerlaboratory.com,godaddy,yes,purelymail,LIVE+EMAIL
+commercialwallcovering.com,godaddy,yes,purelymail,LIVE+EMAIL
+customdigitalwalls.com,godaddy,yes,purelymail,LIVE+EMAIL
+bubbe.ai,cloudflare,yes,none,ON_CF
+designermagnetics.com,godaddy,yes,purelymail,LIVE+EMAIL
+designerrepresentatives.com,godaddy,yes,none,LIVE_SITE
+designerswallcoverings.com,godaddy,yes,purelymail,LIVE+EMAIL
+designerswallcovering.com,godaddy,yes,purelymail,LIVE+EMAIL
+designersalesreps.com,godaddy,yes,purelymail,LIVE+EMAIL
+designerswallpapers.com,godaddy,yes,purelymail,LIVE+EMAIL
+designerschat.com,godaddy,yes,purelymail,LIVE+EMAIL
+designerssalesreps.com,godaddy,yes,none,LIVE_SITE
+designerwallcoverings.com,cloudflare,yes,google,ON_CF
+designerwallcoverings.ai,godaddy,yes,purelymail,LIVE+EMAIL
+designerwallcover.com,godaddy,yes,purelymail,LIVE+EMAIL
+designerwallpaints.com,godaddy,yes,purelymail,LIVE+EMAIL
+designwallcoverings.com,godaddy,yes,purelymail,LIVE+EMAIL
+designerwalltiles.com,godaddy,yes,purelymail,LIVE+EMAIL
+designerwallcovering.com,godaddy,yes,purelymail,LIVE+EMAIL
+dsgn.tv,godaddy,yes,purelymail,LIVE+EMAIL
+dsgntv.com,godaddy,yes,none,LIVE_SITE
+dwlosangeles.com,godaddy,yes,purelymail,LIVE+EMAIL
+designtradereps.com,godaddy,yes,purelymail,LIVE+EMAIL
+designtradesalesreps.com,godaddy,yes,purelymail,LIVE+EMAIL
+etciemurals.com,godaddy,yes,purelymail,LIVE+EMAIL
+designtradelive.com,godaddy,yes,none,LIVE_SITE
+edgrants.org,godaddy,yes,purelymail,LIVE+EMAIL
+ephedrafreeherbs.com,godaddy,yes,none,LIVE_SITE
+fabricfridays.com,godaddy,yes,purelymail,LIVE+EMAIL
+fabricwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+embroideredwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+fauxnewslive.com,godaddy,yes,none,LIVE_SITE
+fabricsondemand.com,godaddy,yes,purelymail,LIVE+EMAIL
+fentucci.com,cloudflare,yes,purelymail,ON_CF
+fireratedwallcovering.com,godaddy,yes,purelymail,LIVE+EMAIL
+flocked.org,godaddy,yes,purelymail,LIVE+EMAIL
+freethedegree.org,godaddy,yes,purelymail,LIVE+EMAIL
+forgivestudentloandebt.com,godaddy,yes,purelymail,LIVE+EMAIL
+ffepurchasing.com,cloudflare,yes,purelymail,ON_CF
+glitterwalls.com,godaddy,yes,purelymail,LIVE+EMAIL
+glassbeadedwallpaper.com,cloudflare,yes,none,ON_CF
+flockedwallpaper.com,cloudflare,yes,none,ON_CF
+goodquestion.ai,cloudflare,yes,none,ON_CF
+fabricfriday.com,godaddy,yes,purelymail,LIVE+EMAIL
+greenwallcoverings.com,godaddy,yes,purelymail,LIVE+EMAIL
+grassclothwallpaper.com,cloudflare,yes,none,ON_CF
+grassclothwallcovering.com,godaddy,yes,purelymail,LIVE+EMAIL
+greendomainbrokers.com,godaddy,yes,purelymail,LIVE+EMAIL
+handcraftedwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+handmadewallcovering.com,godaddy,yes,purelymail,LIVE+EMAIL
+grassclothwallcoverings.com,cloudflare,yes,none,ON_CF
+handmadewallpapers.com,godaddy,yes,purelymail,LIVE+EMAIL
+goldleafwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+healthcarewallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+herbsmadeinchina.com,godaddy,yes,none,LIVE_SITE
+hempofthemonthclub.com,godaddy,yes,none,LIVE_SITE
+hollywoodwallcovering.com,godaddy,yes,purelymail,LIVE+EMAIL
+hollywoodwallcoverings.com,godaddy,yes,purelymail,LIVE+EMAIL
+homesonspec.com,godaddy,yes,none,LIVE_SITE
+handscreenedwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+hospitalityfabrics.net,godaddy,yes,none,LIVE_SITE
+hospitalitydesignreps.com,godaddy,yes,none,LIVE_SITE
+hospitalitymurals.com,godaddy,yes,purelymail,LIVE+EMAIL
+filthyrichliving.com,godaddy,yes,purelymail,LIVE+EMAIL
+hospitalitysalesagency.com,godaddy,yes,purelymail,LIVE+EMAIL
+hospitalitywallcoverings.com,cloudflare,yes,purelymail,ON_CF
+hospitalitywalls.com,godaddy,yes,none,LIVE_SITE
+hospitalitywallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+hospitalitysalesrepresentatives.com,godaddy,yes,none,LIVE_SITE
+interiordesignreps.com,godaddy,yes,purelymail,LIVE+EMAIL
+hospitalitysalesreps.com,godaddy,yes,purelymail,LIVE+EMAIL
+hotelwallcoverings.com,godaddy,yes,purelymail,LIVE+EMAIL
+inflationfears.com,godaddy,yes,purelymail,LIVE+EMAIL
+iwascute.com,godaddy,yes,purelymail,LIVE+EMAIL
+joshdultz.com,godaddy,yes,purelymail,LIVE+EMAIL
+lacountyeats.com,godaddy,yes,none,LIVE_SITE
+jutewallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+latke.ai,godaddy,yes,purelymail,LIVE+EMAIL
+losgardeners.com,godaddy,yes,purelymail,LIVE+EMAIL
+lasjardineras.com,godaddy,yes,purelymail,LIVE+EMAIL
+malibuwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+madagascarwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+marijuanaofthemonthclub.com,godaddy,yes,none,LIVE_SITE
+metallicwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+luxurymurals.com,godaddy,yes,godaddy,LIVE+EMAIL
+losangelesfabrics.com,godaddy,yes,purelymail,LIVE+EMAIL
+marijuanabuyersexchange.com,godaddy,yes,none,LIVE_SITE
+micawallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+muralsondemand.com,godaddy,yes,purelymail,LIVE+EMAIL
+mohairvelvet.com,godaddy,yes,none,LIVE_SITE
+museumwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+montereywallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+nataliaabrams.com,godaddy,yes,purelymail,LIVE+EMAIL
+mymemosamples.com,godaddy,yes,none,LIVE_SITE
+mylarwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+hospitalitysalesagents.com,godaddy,yes,purelymail,LIVE+EMAIL
+nationalpaperhangers.com,godaddy,yes,purelymail,LIVE+EMAIL
+nationalvotingday.org,godaddy,yes,none,LIVE_SITE
+naturalwallcoverings.com,godaddy,yes,purelymail,LIVE+EMAIL
+notvrequired.com,godaddy,yes,none,LIVE_SITE
+nybutler.com,godaddy,yes,none,LIVE_SITE
+linenwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+petitionyour.org,godaddy,yes,none,LIVE_SITE
+nodailyworries.com,godaddy,yes,none,LIVE_SITE
+novasuede.com,cloudflare,yes,godaddy,ON_CF
+potofthemonthclub.com,godaddy,yes,none,LIVE_SITE
+pastelwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+petitionyour.com,cloudflare,yes,none,ON_CF
+naturaltextilewallpaper.com,godaddy,yes,none,LIVE_SITE
+philliperomano.com,godaddy,yes,purelymail,LIVE+EMAIL
+protectyourspec.com,godaddy,yes,none,LIVE_SITE
+printmurals.com,godaddy,yes,purelymail,LIVE+EMAIL
+patterndesignlab.com,godaddy,yes,purelymail,LIVE+EMAIL
+raffiawalls.com,godaddy,yes,purelymail,LIVE+EMAIL
+raffiawallcoverings.com,godaddy,yes,purelymail,LIVE+EMAIL
+protestdaily.com,godaddy,yes,purelymail,LIVE+EMAIL
+restaurantwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+restaurantfabrics.com,godaddy,yes,purelymail,LIVE+EMAIL
+naturalwalltextures.com,godaddy,yes,purelymail,LIVE+EMAIL
+restaurantmurals.com,godaddy,yes,purelymail,LIVE+EMAIL
+restorationwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+retrowalls.com,godaddy,yes,purelymail,LIVE+EMAIL
+roomsettings.com,godaddy,yes,purelymail,LIVE+EMAIL
+saloonwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+selfadhesivewallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+screenprintedwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+silkwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+specifywallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+silverleafwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+stringwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+studentdebtattorney.com,godaddy,yes,purelymail,LIVE+EMAIL
+silkwallcoverings.com,godaddy,yes,purelymail,LIVE+EMAIL
+starsofdesign.com,godaddy,yes,none,LIVE_SITE
+philipperomano.com,cloudflare,yes,none,ON_CF
+studentdebtcrisis.com,godaddy,yes,google,LIVE+EMAIL
+studentdebthotline.org,godaddy,yes,purelymail,LIVE+EMAIL
+steveabramsdesigns.com,godaddy,yes,purelymail,LIVE+EMAIL
+studentdebtlawyers.org,godaddy,yes,purelymail,LIVE+EMAIL
+studentstrikes.org,godaddy,yes,purelymail,LIVE+EMAIL
+summergamesrentals.com,godaddy,yes,none,LIVE_SITE
+sheltermagazines.com,godaddy,yes,purelymail,LIVE+EMAIL
+theatrewallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+textilewallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+suedewallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+thecannabisnews.com,godaddy,yes,purelymail,LIVE+EMAIL
+studentdebtcrisis.org,other,yes,google,LIVE+EMAIL
+thedesignerlibrary.com,godaddy,yes,purelymail,LIVE+EMAIL
+thesetdecorator.com,godaddy,yes,purelymail,LIVE+EMAIL
+tradeonlytextiles.com,godaddy,no,purelymail,EMAIL_ONLY
+thehotelwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+traditionalwhimsy.com,godaddy,yes,purelymail,LIVE+EMAIL
+thedesignerlaboratory.com,godaddy,yes,purelymail,LIVE+EMAIL
+urthfriendly.com,godaddy,yes,none,LIVE_SITE
+treetrimmingguys.com,godaddy,yes,purelymail,LIVE+EMAIL
+textiletuesday.com,godaddy,yes,purelymail,LIVE+EMAIL
+upperonepercent.com,godaddy,yes,purelymail,LIVE+EMAIL
+unitedstateswallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+studentdebtcrisiscenter.com,godaddy,yes,google,LIVE+EMAIL
+venturacorridor.com,godaddy,yes,none,LIVE_SITE
+wallco.ai,godaddy,yes,purelymail,LIVE+EMAIL
+vinylwallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+venturadelivers.com,godaddy,yes,none,LIVE_SITE
+valleybutler.com,godaddy,yes,none,LIVE_SITE
+wall-papers.org,godaddy,yes,none,LIVE_SITE
+vintagebh.com,godaddy,yes,purelymail,LIVE+EMAIL
+wallpapercontractor.com,godaddy,yes,none,LIVE_SITE
+wallcovering.net,godaddy,yes,purelymail,LIVE+EMAIL
+wallpaperdictionary.com,godaddy,yes,purelymail,LIVE+EMAIL
+wallpaperfromthe80s.com,godaddy,yes,purelymail,LIVE+EMAIL
+wallpaperexports.com,godaddy,yes,purelymail,LIVE+EMAIL
+wallpaperestimator.com,godaddy,yes,none,LIVE_SITE
+wallpapercanada.com,cloudflare,yes,purelymail,ON_CF
+wallpaperglossary.com,godaddy,yes,purelymail,LIVE+EMAIL
+wallpaperhistory.com,godaddy,yes,purelymail,LIVE+EMAIL
+thesalesreps.com,godaddy,yes,purelymail,LIVE+EMAIL
+wallpapernyc.com,godaddy,yes,purelymail,LIVE+EMAIL
+wallpapernashville.com,godaddy,yes,none,LIVE_SITE
+wallpaperny.com,godaddy,yes,purelymail,LIVE+EMAIL
+wallpaperondemand.com,godaddy,yes,purelymail,LIVE+EMAIL
+wallpaperdistributors.com,godaddy,yes,none,LIVE_SITE
+wallpaperweekly.com,godaddy,yes,purelymail,LIVE+EMAIL
+wallpaperwednesday.com,godaddy,yes,purelymail,LIVE+EMAIL
+venturaclaw.com,godaddy,yes,purelymail,LIVE+EMAIL
+wallsandfabrics.com,godaddy,yes,purelymail,LIVE+EMAIL
+wallpaperpurchasing.com,godaddy,yes,purelymail,LIVE+EMAIL
+wallsondemand.com,godaddy,yes,purelymail,LIVE+EMAIL
+wallpaperdefinitions.com,godaddy,yes,purelymail,LIVE+EMAIL
+weedofthemonthclub.com,godaddy,yes,none,LIVE_SITE
+wc-01.com,godaddy,yes,purelymail,LIVE+EMAIL
+venturaeats.com,godaddy,yes,none,LIVE_SITE
+wc01wallcoverings.com,godaddy,yes,purelymail,LIVE+EMAIL
+wc01wallpaper.com,godaddy,yes,purelymail,LIVE+EMAIL
+wholivedthere.com,godaddy,yes,none,LIVE_SITE
+zayde.ai,godaddy,yes,purelymail,LIVE+EMAIL
+withoutstudentdebt.org,godaddy,yes,purelymail,LIVE+EMAIL
+withoutstudentdebt.com,godaddy,yes,purelymail,LIVE+EMAIL
+wallpapersback.com,cloudflare,yes,purelymail,ON_CF
+wintergamesrentals.com,godaddy,yes,none,LIVE_SITE
+stevenabramsphotography.com,godaddy,no,purelymail,EMAIL_ONLY
+studentdebtcrisiscenter.org,other,yes,google,LIVE+EMAIL
+studentdebtlawyers.com,other,yes,purelymail,LIVE+EMAIL
+studentloanvoter.com,other,yes,purelymail,LIVE+EMAIL
diff --git a/stage.py b/stage.py
new file mode 100644
index 0000000..3e3e7ca
--- /dev/null
+++ b/stage.py
@@ -0,0 +1,194 @@
+#!/usr/bin/env python3
+"""
+Phase-2 CF-DNS staging engine.
+
+For each domain: read its LIVE records from GoDaddy, ensure a Cloudflare zone
+exists, and replicate the records into that zone idempotently. NOTHING cuts over
+here — the domain keeps its GoDaddy nameservers until a human does the NS-swap,
+so a staged CF zone is dormant/safe. The point is that when the swap happens the
+zone is already a faithful copy, so there's zero downtime.
+
+  python3 stage.py --dry-run homesonspec.com          # show what would happen
+  python3 stage.py homesonspec.com foo.com            # stage specific domains
+  python3 stage.py --from worklist.csv --limit 5      # stage first 5 from worklist
+  python3 stage.py --from worklist.csv                # stage the whole worklist
+
+Records are replicated DNS-only (grey cloud) to mirror GoDaddy exactly; enable
+the CF proxy per-site later if wanted. NS/SOA and GoDaddy-proprietary
+`_domainconnect` records are never copied.
+"""
+import json, os, sys, time, urllib.request, urllib.error
+
+ENV = os.path.expanduser("~/Projects/secrets-manager/.env")
+def load_env(path):
+    e = {}
+    for line in open(path, encoding="utf-8", errors="ignore"):
+        line = line.strip()
+        if line and not line.startswith("#") and "=" in line:
+            k, v = line.split("=", 1)
+            e[k.strip()] = v.strip().strip('"').strip("'")
+    return e
+E = load_env(ENV)
+GD_KEY = E.get("GODADDY_API_KEY"); GD_SEC = E.get("GODADDY_API_SECRET")
+CF_TOKEN = E.get("CLOUDFLARE_API_TOKEN") or E.get("CF_API_TOKEN") or E.get("CLOUDFLARE_DNS_TOKEN")
+
+COPY_TYPES = {"A", "AAAA", "CNAME", "MX", "TXT", "SRV", "CAA", "NS_SUB"}  # zone-apex NS handled by CF
+SKIP_NAMES = {"_domainconnect"}
+
+def req(url, method="GET", headers=None, body=None):
+    data = json.dumps(body).encode() if body is not None else None
+    r = urllib.request.Request(url, data=data, method=method, headers=headers or {})
+    try:
+        with urllib.request.urlopen(r, timeout=30) as resp:
+            return resp.status, json.loads(resp.read().decode())
+    except urllib.error.HTTPError as ex:
+        try: return ex.code, json.loads(ex.read().decode())
+        except Exception: return ex.code, {"error": str(ex)}
+    except Exception as ex:
+        return 0, {"error": str(ex)}
+
+# ---- GoDaddy ----
+def gd_records(domain):
+    _, d = req(f"https://api.godaddy.com/v1/domains/{domain}/records",
+               headers={"Authorization": f"sso-key {GD_KEY}:{GD_SEC}"})
+    return d if isinstance(d, list) else []
+
+# ---- Cloudflare ----
+CF_H = {"Authorization": f"Bearer {CF_TOKEN}", "Content-Type": "application/json"}
+def cf_zone(domain):
+    _, d = req(f"https://api.cloudflare.com/client/v4/zones?name={domain}", headers=CF_H)
+    res = d.get("result") or []
+    return res[0] if res else None
+def cf_create_zone(domain):
+    _, d = req("https://api.cloudflare.com/client/v4/zones", "POST", CF_H,
+               {"name": domain, "type": "full"})
+    return d.get("result") if d.get("success") else None
+def cf_records(zid):
+    out, page = [], 1
+    while True:
+        _, d = req(f"https://api.cloudflare.com/client/v4/zones/{zid}/dns_records?per_page=100&page={page}", headers=CF_H)
+        res = d.get("result") or []
+        out += res
+        if len(res) < 100: break
+        page += 1
+    return out
+def cf_add(zid, rec):
+    return req(f"https://api.cloudflare.com/client/v4/zones/{zid}/dns_records", "POST", CF_H, rec)
+
+def gd_to_cf(domain, r):
+    """Map a GoDaddy record to a Cloudflare dns_records payload, or None to skip."""
+    t = r.get("type")
+    name = r.get("name", "@")
+    if t in ("NS", "SOA") or name in SKIP_NAMES or t not in ("A","AAAA","CNAME","MX","TXT","SRV","CAA"):
+        return None
+    fqdn = domain if name == "@" else f"{name}.{domain}"
+    data = r.get("data", "")
+    if t == "CNAME" and data in ("@", ""):
+        data = domain
+    rec = {"type": t, "name": fqdn, "content": data, "ttl": max(int(r.get("ttl", 600) or 600), 60), "proxied": False}
+    if t == "MX":
+        rec["priority"] = int(r.get("priority", 10) or 10)
+        rec.pop("proxied", None)
+    if t in ("TXT", "SRV", "CAA"):
+        rec.pop("proxied", None)
+    return rec
+
+def rec_key(t, name, content):
+    return (t, name.rstrip("."), str(content).strip().strip('"'))
+
+def stage(domain, dry=False):
+    gd = gd_records(domain)
+    if not gd:
+        return {"domain": domain, "status": "no-godaddy-records", "added": 0, "existing": 0, "ns": ""}
+    zone = cf_zone(domain)
+    created = False
+    if not zone:
+        if dry:
+            zone = {"id": "(would-create)", "name_servers": ["(assigned-on-create)"]}
+        else:
+            zone = cf_create_zone(domain)
+            created = True
+            if not zone:
+                return {"domain": domain, "status": "cf-zone-create-failed", "added": 0, "existing": 0, "ns": ""}
+    zid = zone["id"]
+    existing = [] if zid == "(would-create)" else cf_records(zid)
+    have = {rec_key(r["type"], r["name"], r.get("content", "")) for r in existing}
+    # Structural state so we never create an invalid zone when CF is already curated:
+    types_at = {}                      # name -> {types present}
+    dmarc_at, spf_at = set(), set()    # names that already have a DMARC / SPF TXT
+    for r in existing:
+        nm = r["name"].rstrip(".")
+        types_at.setdefault(nm, set()).add(r["type"])
+        c = str(r.get("content", "")).strip('"').lower()
+        if r["type"] == "TXT" and c.startswith("v=dmarc1"): dmarc_at.add(nm)
+        if r["type"] == "TXT" and c.startswith("v=spf1"): spf_at.add(nm)
+    added = kept = 0
+    for r in gd:
+        payload = gd_to_cf(domain, r)
+        if not payload: continue
+        nm = payload["name"].rstrip("."); c = str(payload["content"]).strip('"').lower()
+        here = types_at.get(nm, set())
+        # CNAME must be the ONLY record at a name; and DMARC/SPF are singletons.
+        if payload["type"] == "CNAME" and here: kept += 1; continue
+        if payload["type"] != "CNAME" and "CNAME" in here: kept += 1; continue
+        if payload["type"] == "TXT" and c.startswith("v=dmarc1") and nm in dmarc_at: kept += 1; continue
+        if payload["type"] == "TXT" and c.startswith("v=spf1") and nm in spf_at: kept += 1; continue
+        k = rec_key(payload["type"], payload["name"], payload["content"])
+        if k in have:
+            kept += 1; continue
+        # commit to adding — update running structural state so later records see it
+        types_at.setdefault(nm, set()).add(payload["type"]); have.add(k)
+        if payload["type"] == "TXT" and c.startswith("v=dmarc1"): dmarc_at.add(nm)
+        if payload["type"] == "TXT" and c.startswith("v=spf1"): spf_at.add(nm)
+        if dry:
+            print(f"    + {payload['type']:6} {payload['name']:34} -> {str(payload['content'])[:46]}")
+            added += 1
+        else:
+            code, resp = cf_add(zid, payload)
+            if resp.get("success"): added += 1
+            else:
+                # duplicate/exists errors are fine (idempotent); log others
+                errs = resp.get("errors", [])
+                if any("already exists" in str(e).lower() for e in errs): kept += 1
+                else: print(f"    ! {payload['type']} {payload['name']}: {errs}")
+        time.sleep(0.05)
+    ns = ",".join(zone.get("name_servers", []) or [])
+    return {"domain": domain, "status": ("staged" + ("+created" if created else "")) if not dry else "dry",
+            "added": added, "existing": kept, "ns": ns, "zone_id": zid}
+
+def main():
+    args = sys.argv[1:]
+    dry = "--dry-run" in args; args = [a for a in args if a != "--dry-run"]
+    limit = None; domains = []
+    i = 0
+    while i < len(args):
+        if args[i] == "--limit": limit = int(args[i+1]); i += 2
+        elif args[i] == "--from":
+            import csv
+            for row in csv.DictReader(open(args[i+1])): domains.append(row["domain"])
+            i += 2
+        else: domains.append(args[i]); i += 1
+    if limit: domains = domains[:limit]
+    if not domains:
+        print("usage: stage.py [--dry-run] [--from worklist.csv] [--limit N] [domain ...]"); sys.exit(1)
+    if not (GD_KEY and GD_SEC and CF_TOKEN):
+        print("missing creds (GODADDY_API_KEY/SECRET, CLOUDFLARE_API_TOKEN)"); sys.exit(1)
+    print(f"{'DRY-RUN' if dry else 'STAGING'} {len(domains)} domain(s)\n")
+    results = []
+    for d in domains:
+        print(f"── {d}")
+        res = stage(d, dry)
+        results.append(res)
+        print(f"   {res['status']}: +{res['added']} new, {res['existing']} already present"
+              + (f" | NS: {res['ns']}" if res['ns'] else ""))
+    # emit the NS-swap worklist
+    out = "staged-nameservers.csv"
+    if not dry:
+        import csv
+        with open(out, "w", newline="") as f:
+            w = csv.writer(f); w.writerow(["domain", "status", "added", "cf_nameservers"])
+            for r in results: w.writerow([r["domain"], r["status"], r["added"], r["ns"]])
+        print(f"\nNS-swap worklist → {out} (set each domain's GoDaddy nameservers to its cf_nameservers)")
+
+if __name__ == "__main__":
+    main()
diff --git a/worklist.csv b/worklist.csv
new file mode 100644
index 0000000..1539023
--- /dev/null
+++ b/worklist.csv
@@ -0,0 +1,242 @@
+domain,bucket,mx,priority

+1890swallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+800wallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+1930swallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+1800wallpapers.com,LIVE+EMAIL,purelymail,P3-has-email

+1980swallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+aaatreetrimming.com,LIVE+EMAIL,purelymail,P3-has-email

+1960swallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+1800wallcoverings.com,LIVE+EMAIL,purelymail,P3-has-email

+90210rentals.com,LIVE_SITE,none,P2-site-only

+1920swallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+67calc.com,LIVE+EMAIL,purelymail,P3-has-email

+1940swallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+1970swallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+1950swallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+1900swallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+1800swallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+allnewsdaily.com,LIVE_SITE,none,P2-site-only

+apartmentwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+asknonna.ai,LIVE+EMAIL,purelymail,P3-has-email

+askgoodquestions.ai,LIVE+EMAIL,purelymail,P3-has-email

+barwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+asseeninmovies.com,LIVE+EMAIL,purelymail,P3-has-email

+asseeninshowrooms.com,LIVE+EMAIL,purelymail,P3-has-email

+agedwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+architecturalwallcoverings.com,LIVE+EMAIL,purelymail,P3-has-email

+bestactorawards.com,LIVE_SITE,none,P2-site-only

+bestdocumentaryfilms.com,LIVE_SITE,none,P2-site-only

+bestwallpaperplace.com,LIVE+EMAIL,purelymail,P3-has-email

+beverlyandhills.com,LIVE+EMAIL,purelymail,P3-has-email

+beverlyhillspaints.com,LIVE+EMAIL,purelymail,P3-has-email

+blockprintedwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+bubbie.ai,LIVE+EMAIL,purelymail,P3-has-email

+borrowerbills.org,LIVE+EMAIL,purelymail,P3-has-email

+bleachfriendly.com,LIVE+EMAIL,purelymail,P3-has-email

+bubbeleh.ai,LIVE+EMAIL,purelymail,P3-has-email

+borninbh.com,LIVE+EMAIL,purelymail,P3-has-email

+bubbesblock.com,LIVE_SITE,none,P2-site-only

+cannabisofthemonthclub.com,LIVE_SITE,none,P2-site-only

+blankstocklining.com,LIVE+EMAIL,purelymail,P3-has-email

+carmelriverwater.com,LIVE+EMAIL,purelymail,P3-has-email

+carmelpaints.com,LIVE+EMAIL,purelymail,P3-has-email

+asseeninhotels.com,LIVE+EMAIL,purelymail,P3-has-email

+asseeninla.com,LIVE+EMAIL,purelymail,P3-has-email

+carmelvalleywater.com,LIVE+EMAIL,purelymail,P3-has-email

+carmelwallpapers.com,LIVE+EMAIL,purelymail,P3-has-email

+cfafabrics.com,LIVE+EMAIL,purelymail,P3-has-email

+carmelwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+classawallcovering.com,LIVE+EMAIL,purelymail,P3-has-email

+chinoiseriewallpaper.com,LIVE_SITE,none,P2-site-only

+commercialdesignreps.com,LIVE_SITE,none,P2-site-only

+claimmyaddress.com,LIVE_SITE,none,P2-site-only

+cleaninggrants.com,LIVE_SITE,none,P2-site-only

+contractwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+corkwallcovering.com,LIVE+EMAIL,purelymail,P3-has-email

+cleaninggrants.org,LIVE_SITE,none,P2-site-only

+customdigitalmurals.com,LIVE+EMAIL,purelymail,P3-has-email

+commercialsalesreps.com,LIVE+EMAIL,purelymail,P3-has-email

+customdigitalwallcoverings.com,LIVE+EMAIL,purelymail,P3-has-email

+commercialwalls.com,LIVE+EMAIL,purelymail,P3-has-email

+cypresawards.org,LIVE+EMAIL,purelymail,P3-has-email

+designerlaboratory.com,LIVE+EMAIL,purelymail,P3-has-email

+commercialwallcovering.com,LIVE+EMAIL,purelymail,P3-has-email

+customdigitalwalls.com,LIVE+EMAIL,purelymail,P3-has-email

+designermagnetics.com,LIVE+EMAIL,purelymail,P3-has-email

+designerrepresentatives.com,LIVE_SITE,none,P2-site-only

+designerswallcoverings.com,LIVE+EMAIL,purelymail,P3-has-email

+designerswallcovering.com,LIVE+EMAIL,purelymail,P3-has-email

+designersalesreps.com,LIVE+EMAIL,purelymail,P3-has-email

+designerswallpapers.com,LIVE+EMAIL,purelymail,P3-has-email

+designerschat.com,LIVE+EMAIL,purelymail,P3-has-email

+designerssalesreps.com,LIVE_SITE,none,P2-site-only

+designerwallcoverings.ai,LIVE+EMAIL,purelymail,P3-has-email

+designerwallcover.com,LIVE+EMAIL,purelymail,P3-has-email

+designerwallpaints.com,LIVE+EMAIL,purelymail,P3-has-email

+designwallcoverings.com,LIVE+EMAIL,purelymail,P3-has-email

+designerwalltiles.com,LIVE+EMAIL,purelymail,P3-has-email

+designerwallcovering.com,LIVE+EMAIL,purelymail,P3-has-email

+dsgn.tv,LIVE+EMAIL,purelymail,P3-has-email

+dsgntv.com,LIVE_SITE,none,P2-site-only

+dwlosangeles.com,LIVE+EMAIL,purelymail,P3-has-email

+designtradereps.com,LIVE+EMAIL,purelymail,P3-has-email

+designtradesalesreps.com,LIVE+EMAIL,purelymail,P3-has-email

+etciemurals.com,LIVE+EMAIL,purelymail,P3-has-email

+designtradelive.com,LIVE_SITE,none,P2-site-only

+edgrants.org,LIVE+EMAIL,purelymail,P3-has-email

+ephedrafreeherbs.com,LIVE_SITE,none,P2-site-only

+fabricfridays.com,LIVE+EMAIL,purelymail,P3-has-email

+fabricwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+embroideredwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+fauxnewslive.com,LIVE_SITE,none,P2-site-only

+fabricsondemand.com,LIVE+EMAIL,purelymail,P3-has-email

+fireratedwallcovering.com,LIVE+EMAIL,purelymail,P3-has-email

+flocked.org,LIVE+EMAIL,purelymail,P3-has-email

+freethedegree.org,LIVE+EMAIL,purelymail,P3-has-email

+forgivestudentloandebt.com,LIVE+EMAIL,purelymail,P3-has-email

+glitterwalls.com,LIVE+EMAIL,purelymail,P3-has-email

+fabricfriday.com,LIVE+EMAIL,purelymail,P3-has-email

+greenwallcoverings.com,LIVE+EMAIL,purelymail,P3-has-email

+grassclothwallcovering.com,LIVE+EMAIL,purelymail,P3-has-email

+greendomainbrokers.com,LIVE+EMAIL,purelymail,P3-has-email

+handcraftedwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+handmadewallcovering.com,LIVE+EMAIL,purelymail,P3-has-email

+handmadewallpapers.com,LIVE+EMAIL,purelymail,P3-has-email

+goldleafwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+healthcarewallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+herbsmadeinchina.com,LIVE_SITE,none,P2-site-only

+hempofthemonthclub.com,LIVE_SITE,none,P2-site-only

+hollywoodwallcovering.com,LIVE+EMAIL,purelymail,P3-has-email

+hollywoodwallcoverings.com,LIVE+EMAIL,purelymail,P3-has-email

+homesonspec.com,LIVE_SITE,none,P1-needs-email

+handscreenedwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+hospitalityfabrics.net,LIVE_SITE,none,P2-site-only

+hospitalitydesignreps.com,LIVE_SITE,none,P2-site-only

+hospitalitymurals.com,LIVE+EMAIL,purelymail,P3-has-email

+filthyrichliving.com,LIVE+EMAIL,purelymail,P3-has-email

+hospitalitysalesagency.com,LIVE+EMAIL,purelymail,P3-has-email

+hospitalitywalls.com,LIVE_SITE,none,P2-site-only

+hospitalitywallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+hospitalitysalesrepresentatives.com,LIVE_SITE,none,P2-site-only

+interiordesignreps.com,LIVE+EMAIL,purelymail,P3-has-email

+hospitalitysalesreps.com,LIVE+EMAIL,purelymail,P3-has-email

+hotelwallcoverings.com,LIVE+EMAIL,purelymail,P3-has-email

+inflationfears.com,LIVE+EMAIL,purelymail,P3-has-email

+iwascute.com,LIVE+EMAIL,purelymail,P3-has-email

+joshdultz.com,LIVE+EMAIL,purelymail,P3-has-email

+lacountyeats.com,LIVE_SITE,none,P2-site-only

+jutewallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+latke.ai,LIVE+EMAIL,purelymail,P3-has-email

+losgardeners.com,LIVE+EMAIL,purelymail,P3-has-email

+lasjardineras.com,LIVE+EMAIL,purelymail,P3-has-email

+malibuwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+madagascarwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+marijuanaofthemonthclub.com,LIVE_SITE,none,P2-site-only

+metallicwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+luxurymurals.com,LIVE+EMAIL,godaddy,P3-has-email

+losangelesfabrics.com,LIVE+EMAIL,purelymail,P3-has-email

+marijuanabuyersexchange.com,LIVE_SITE,none,P2-site-only

+micawallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+muralsondemand.com,LIVE+EMAIL,purelymail,P3-has-email

+mohairvelvet.com,LIVE_SITE,none,P2-site-only

+museumwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+montereywallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+nataliaabrams.com,LIVE+EMAIL,purelymail,P3-has-email

+mymemosamples.com,LIVE_SITE,none,P2-site-only

+mylarwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+hospitalitysalesagents.com,LIVE+EMAIL,purelymail,P3-has-email

+nationalpaperhangers.com,LIVE+EMAIL,purelymail,P3-has-email

+nationalvotingday.org,LIVE_SITE,none,P2-site-only

+naturalwallcoverings.com,LIVE+EMAIL,purelymail,P3-has-email

+notvrequired.com,LIVE_SITE,none,P2-site-only

+nybutler.com,LIVE_SITE,none,P2-site-only

+linenwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+petitionyour.org,LIVE_SITE,none,P2-site-only

+nodailyworries.com,LIVE_SITE,none,P2-site-only

+potofthemonthclub.com,LIVE_SITE,none,P2-site-only

+pastelwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+naturaltextilewallpaper.com,LIVE_SITE,none,P2-site-only

+philliperomano.com,LIVE+EMAIL,purelymail,P3-has-email

+protectyourspec.com,LIVE_SITE,none,P2-site-only

+printmurals.com,LIVE+EMAIL,purelymail,P3-has-email

+patterndesignlab.com,LIVE+EMAIL,purelymail,P3-has-email

+raffiawalls.com,LIVE+EMAIL,purelymail,P3-has-email

+raffiawallcoverings.com,LIVE+EMAIL,purelymail,P3-has-email

+protestdaily.com,LIVE+EMAIL,purelymail,P3-has-email

+restaurantwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+restaurantfabrics.com,LIVE+EMAIL,purelymail,P3-has-email

+naturalwalltextures.com,LIVE+EMAIL,purelymail,P3-has-email

+restaurantmurals.com,LIVE+EMAIL,purelymail,P3-has-email

+restorationwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+retrowalls.com,LIVE+EMAIL,purelymail,P3-has-email

+roomsettings.com,LIVE+EMAIL,purelymail,P3-has-email

+saloonwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+selfadhesivewallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+screenprintedwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+silkwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+specifywallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+silverleafwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+stringwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+studentdebtattorney.com,LIVE+EMAIL,purelymail,P3-has-email

+silkwallcoverings.com,LIVE+EMAIL,purelymail,P3-has-email

+starsofdesign.com,LIVE_SITE,none,P2-site-only

+studentdebthotline.org,LIVE+EMAIL,purelymail,P3-has-email

+steveabramsdesigns.com,LIVE+EMAIL,purelymail,P3-has-email

+studentdebtlawyers.org,LIVE+EMAIL,purelymail,P3-has-email

+studentstrikes.org,LIVE+EMAIL,purelymail,P3-has-email

+summergamesrentals.com,LIVE_SITE,none,P2-site-only

+sheltermagazines.com,LIVE+EMAIL,purelymail,P3-has-email

+theatrewallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+textilewallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+suedewallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+thecannabisnews.com,LIVE+EMAIL,purelymail,P3-has-email

+thedesignerlibrary.com,LIVE+EMAIL,purelymail,P3-has-email

+thesetdecorator.com,LIVE+EMAIL,purelymail,P3-has-email

+tradeonlytextiles.com,EMAIL_ONLY,purelymail,P2-site-only

+thehotelwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+traditionalwhimsy.com,LIVE+EMAIL,purelymail,P3-has-email

+thedesignerlaboratory.com,LIVE+EMAIL,purelymail,P3-has-email

+urthfriendly.com,LIVE_SITE,none,P2-site-only

+treetrimmingguys.com,LIVE+EMAIL,purelymail,P3-has-email

+textiletuesday.com,LIVE+EMAIL,purelymail,P3-has-email

+upperonepercent.com,LIVE+EMAIL,purelymail,P3-has-email

+unitedstateswallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+venturacorridor.com,LIVE_SITE,none,P2-site-only

+wallco.ai,LIVE+EMAIL,purelymail,P3-has-email

+vinylwallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+venturadelivers.com,LIVE_SITE,none,P2-site-only

+valleybutler.com,LIVE_SITE,none,P2-site-only

+wall-papers.org,LIVE_SITE,none,P2-site-only

+vintagebh.com,LIVE+EMAIL,purelymail,P3-has-email

+wallpapercontractor.com,LIVE_SITE,none,P2-site-only

+wallcovering.net,LIVE+EMAIL,purelymail,P3-has-email

+wallpaperdictionary.com,LIVE+EMAIL,purelymail,P3-has-email

+wallpaperfromthe80s.com,LIVE+EMAIL,purelymail,P3-has-email

+wallpaperexports.com,LIVE+EMAIL,purelymail,P3-has-email

+wallpaperestimator.com,LIVE_SITE,none,P2-site-only

+wallpaperglossary.com,LIVE+EMAIL,purelymail,P3-has-email

+wallpaperhistory.com,LIVE+EMAIL,purelymail,P3-has-email

+thesalesreps.com,LIVE+EMAIL,purelymail,P3-has-email

+wallpapernyc.com,LIVE+EMAIL,purelymail,P3-has-email

+wallpapernashville.com,LIVE_SITE,none,P2-site-only

+wallpaperny.com,LIVE+EMAIL,purelymail,P3-has-email

+wallpaperondemand.com,LIVE+EMAIL,purelymail,P3-has-email

+wallpaperdistributors.com,LIVE_SITE,none,P2-site-only

+wallpaperweekly.com,LIVE+EMAIL,purelymail,P3-has-email

+wallpaperwednesday.com,LIVE+EMAIL,purelymail,P3-has-email

+venturaclaw.com,LIVE+EMAIL,purelymail,P3-has-email

+wallsandfabrics.com,LIVE+EMAIL,purelymail,P3-has-email

+wallpaperpurchasing.com,LIVE+EMAIL,purelymail,P3-has-email

+wallsondemand.com,LIVE+EMAIL,purelymail,P3-has-email

+wallpaperdefinitions.com,LIVE+EMAIL,purelymail,P3-has-email

+weedofthemonthclub.com,LIVE_SITE,none,P2-site-only

+wc-01.com,LIVE+EMAIL,purelymail,P3-has-email

+venturaeats.com,LIVE_SITE,none,P2-site-only

+wc01wallcoverings.com,LIVE+EMAIL,purelymail,P3-has-email

+wc01wallpaper.com,LIVE+EMAIL,purelymail,P3-has-email

+wholivedthere.com,LIVE_SITE,none,P2-site-only

+zayde.ai,LIVE+EMAIL,purelymail,P3-has-email

+withoutstudentdebt.org,LIVE+EMAIL,purelymail,P3-has-email

+withoutstudentdebt.com,LIVE+EMAIL,purelymail,P3-has-email

+wintergamesrentals.com,LIVE_SITE,none,P2-site-only

+stevenabramsphotography.com,EMAIL_ONLY,purelymail,P2-site-only

(oldest)  ·  back to Cf Dns Migration  ·  stage.py fixes: GoDaddy read backoff/retry (kills false-empt 9f7662a →