Call it
BathSwipe.ai.
It sells the whole result: showers, walk-in tubs, accessible baths, surrounds, vanities, finishes, and full remodels. TubSwipe would shrink our strongest second product down to one fixture.
PaintSwipe proved the pattern. The next business is a coordinated family of product-aware visualizers that feeds contractor leads, white-label subscriptions, product commerce, and manufacturer catalogs.
Written fallback: BathSwipe is the recommended bathroom brand and PaveSwipe is the approved driveway/flatwork working name. Nine public products share one internal SwipeOS platform. PaveSwipe now has a working private proof; its domain remains unpurchased. Every trade keeps a human approval gate for safety, feasibility, pricing, and product availability.
It sells the whole result: showers, walk-in tubs, accessible baths, surrounds, vanities, finishes, and full remodels. TubSwipe would shrink our strongest second product down to one fixture.
These links were checked before this page was published. Paint, Bath, and Pave are working proof; the remaining collection cards below are planned products, not live tools.
The product home for our real-property paint visualization system.
Open PaintSwipe.ai ↗Advanced Painting's working exterior paint tool and production proof.
Open paint tool ↗The live bathroom proof with real tubs, products, finishes, filters, and quote intent.
Open bathroom tool ↗The same live tool with its built-in diagnostic and Website Super Glasses layer enabled.
Open Super Glasses ↗Address-first street-view lock, driveway outline, five surface directions, contractor site, and browser-only project card.
Open PaveSwipe ↗This is the build broken into understandable parts: research decides the opportunity, the registry defines the products, SwipeOS turns the plan into reusable configuration, validators stop bad packages, and the review page makes the decisions visible.
The front door. It locks the BathSwipe naming decision, lists the collection, explains the folder, and records the launch order.
Read the full README ↓The evidence. It compares competitors, domain signals, category gaps, revenue options, and why generic AI imagery is not enough.
Read the market sweep ↓The machine's product list. It gives software one dependable source for all nine brands, waves, scores, domain states, and money lanes.
Inspect the registry source ↓The system blueprint. It explains the shared tenant, catalog, render, QC, lead, commerce, analytics, and monitoring modules.
Read the architecture ↓The visual rules. It keeps the whole collection recognizable across private boards, product pages, and future contractor versions.
Read the design DNA ↓The browser board. It turns the research and plans into the visual decision page you are using right now, including voice and controls.
Return to the live board ↑The reusable product engine package: one tenant schema, Bath/Paint/Siding/Pave recipes, and a safe Liberty draft showing how contractors plug in.
Inspect the SwipeOS source ↓The quality gates. Two validators prove that the product registry and SwipeOS configuration are complete and internally safe before use.
Inspect the validators ↓swipe-collection-2026-08-15/
├── README.md
├── MARKET_SWEEP_2026-08-15.md
├── PRODUCT_REGISTRY.json
├── SWIPE_OS_ARCHITECTURE.md
├── DESIGN.md
├── review/index.html + voice
├── swipeos/
│ ├── config.schema.json
│ ├── verticals/bath-v1.json
│ ├── verticals/paint-v1.json
│ ├── verticals/siding-v1.json
│ ├── verticals/pave-v1.json
│ └── tenants/liberty-bathswipe.example.json
└── scripts/
├── validate_registry.mjs
└── validate_swipeos.mjsThe Markdown is rendered later on this page. These expandable panels show the complete registry, schema, recipes, safe tenant draft, and validation scripts—551 original source lines.
The machine-readable lineup: all nine products, launch waves, scores, domain state, revenue lanes, and product-specific cautions.
{
"schema_version": "1.0.0",
"updated": "2026-08-16",
"platform": {
"internal_name": "SwipeOS",
"public_family_name": "The Swipe Collection",
"existing_flagship": "PaintSwipe.ai",
"shared_engine_rule": "One platform, vertical-specific recipes and catalogs"
},
"products": [
{
"id": "paint",
"name": "PaintSwipe",
"domain": "paintswipe.ai",
"domain_state": "owned",
"status": "existing",
"wave": 1,
"priority_score": 100,
"promise": "Preview real paint colors on the homeowner's actual space and route the project to the selected painter.",
"modes": [
"exterior paint",
"interior paint",
"commercial surfaces"
],
"catalog_targets": [
"Sherwin-Williams",
"Benjamin Moore",
"HGTV Home by Sherwin-Williams",
"Behr",
"Valspar"
],
"revenue_lanes": [
"white-label SaaS",
"qualified painting leads",
"paint/sample affiliate links",
"manufacturer catalog placement"
],
"risk_note": "Physical samples and painter confirmation remain the color authority."
},
{
"id": "bath",
"name": "BathSwipe",
"domain": "bathswipe.ai",
"domain_state": "no RDAP record observed 2026-08-15; checkout required",
"status": "prototype-proven",
"wave": 1,
"priority_score": 95,
"promise": "Turn a real bathroom photo into product-aware remodel directions and a qualified quote request.",
"modes": [
"tub-to-shower",
"walk-in tub",
"accessible bath",
"surrounds",
"vanities",
"finishes"
],
"catalog_targets": [
"Ella's Bubbles",
"Samuel Mueller",
"Kohler",
"Moen",
"Delta",
"Daltile",
"MSI"
],
"revenue_lanes": [
"contractor lead capture",
"white-label SaaS",
"product affiliate links",
"supplier catalog sponsorship"
],
"risk_note": "Render is a concept, not a plumbing plan, measurement, product guarantee, or binding quote."
},
{
"id": "siding",
"name": "SidingSwipe",
"domain": "sidingswipe.ai",
"domain_state": "no RDAP record observed 2026-08-15; checkout required",
"status": "planned",
"wave": 2,
"priority_score": 86,
"promise": "Compare real siding profiles, colors, trim, and accents on the homeowner's actual exterior.",
"modes": [
"vinyl siding",
"fiber cement",
"engineered wood",
"stone accents",
"trim"
],
"catalog_targets": [
"James Hardie",
"CertainTeed",
"LP SmartSide",
"Alside",
"ProVia",
"AZEK Exteriors"
],
"revenue_lanes": [
"siding leads",
"white-label SaaS",
"dealer referrals",
"manufacturer catalog placement"
],
"risk_note": "Texture and color preview must map to locally available product lines."
},
{
"id": "roof",
"name": "RoofSwipe",
"domain": "roofswipe.ai",
"domain_state": "no RDAP record observed 2026-08-15; checkout required",
"status": "planned",
"wave": 2,
"priority_score": 82,
"promise": "Preview real shingle and metal-roof options, then hand the selected look into measurement, proposal, and contractor workflows.",
"modes": [
"asphalt shingles",
"metal roofing",
"roof color",
"whole-exterior coordination"
],
"catalog_targets": [
"GAF",
"Owens Corning",
"CertainTeed",
"IKO",
"TAMKO"
],
"revenue_lanes": [
"roofing leads",
"white-label SaaS",
"dealer referrals",
"manufacturer catalog placement"
],
"risk_note": "Visualization never substitutes for roof measurement, structural inspection, ventilation design, or code review."
},
{
"id": "pave",
"name": "PaveSwipe",
"domain": "paveswipe.ai",
"domain_state": "no RDAP record observed 2026-08-16; checkout required",
"status": "working-prototype",
"wave": 3,
"priority_score": 78,
"promise": "Lock onto a real driveway from an address or photo, compare buildable surface directions, and turn the chosen look into contractor-ready intake.",
"modes": [
"asphalt/blacktop",
"concrete",
"pavers",
"gravel/crushed stone",
"sealcoat/resurfacing",
"driveways",
"sidewalks/walkways",
"aprons/patios",
"parking areas"
],
"catalog_targets": [
"regional asphalt plants",
"regional ready-mix suppliers",
"Unilock",
"Belgard",
"Techo-Bloc",
"regional aggregate yards",
"sealcoat suppliers"
],
"revenue_lanes": [
"paving and concrete leads",
"white-label contractor websites",
"material/dealer referrals",
"maintenance and seasonal follow-up",
"branded proposal exports"
],
"risk_note": "Concept only; imagery does not prove measurements, base condition, drainage, grading, thickness, utilities, accessibility, permits, code, schedule, or price. Final scope requires onsite contractor review."
},
{
"id": "deck",
"name": "DeckSwipe",
"domain": "deckswipe.ai",
"domain_state": "no RDAP record observed 2026-08-15; checkout required",
"status": "planned",
"wave": 3,
"priority_score": 73,
"promise": "Place a product-aware deck concept into a real backyard and carry it into a contractor proposal.",
"modes": [
"composite",
"PVC",
"cedar",
"pressure-treated",
"railings",
"stairs"
],
"catalog_targets": [
"Trex",
"TimberTech",
"AZEK",
"Fiberon",
"Deckorators"
],
"revenue_lanes": [
"deck-builder leads",
"white-label SaaS",
"product affiliate/dealer links",
"branded proposal upgrades"
],
"risk_note": "Concept only; framing, spans, footings, loads, setbacks, permits, and code require professionals."
},
{
"id": "yard",
"name": "YardSwipe",
"domain": "yardswipe.ai",
"domain_state": "no RDAP record observed 2026-08-15; checkout required",
"status": "planned",
"wave": 3,
"priority_score": 70,
"promise": "Show planting, lawn, beds, hardscape, and outdoor-living concepts on the homeowner's own yard.",
"modes": [
"front yard",
"backyard",
"planting beds",
"hardscape",
"patio",
"low-maintenance",
"outdoor living"
],
"catalog_targets": [
"Belgard",
"Techo-Bloc",
"Unilock",
"regional nurseries",
"mulch and sod suppliers"
],
"revenue_lanes": [
"landscaper leads",
"white-label SaaS",
"nursery/material affiliate links",
"sponsored local catalogs"
],
"risk_note": "Plant viability, drainage, grading, utilities, irrigation, and local climate need human/site review."
},
{
"id": "floor",
"name": "FloorSwipe",
"domain": "floorswipe.ai",
"domain_state": "no RDAP record observed 2026-08-15; checkout required",
"status": "planned-crowded-market",
"wave": 4,
"priority_score": 62,
"promise": "Compare carpet, hardwood, tile, vinyl, and laminate SKUs in the shopper's real room.",
"modes": [
"carpet",
"hardwood",
"tile",
"luxury vinyl",
"laminate"
],
"catalog_targets": [
"Shaw",
"Mohawk",
"Engineered Floors",
"Daltile",
"MSI",
"local flooring retailers"
],
"revenue_lanes": [
"retailer leads",
"white-label SaaS",
"sample/product affiliate links",
"manufacturer catalog distribution"
],
"risk_note": "Roomvo and other catalog visualizers are strong; enter with local installer leads and combined-room bundles, not a generic clone."
},
{
"id": "light",
"name": "LightSwipe",
"domain": "lightswipe.ai",
"domain_state": "no RDAP record observed 2026-08-15; checkout required",
"status": "planned-research",
"wave": 4,
"priority_score": 60,
"promise": "Turn a daytime property photo into an installation-oriented evening lighting concept.",
"modes": [
"architectural uplighting",
"path lighting",
"deck and patio",
"permanent exterior LEDs",
"seasonal lighting"
],
"catalog_targets": [
"Kichler",
"FX Luminaire",
"WAC Landscape Lighting",
"Volt",
"Lutron",
"Gemstone Lights"
],
"revenue_lanes": [
"lighting-contractor leads",
"white-label SaaS",
"fixture affiliate/dealer links",
"proposal exports"
],
"risk_note": "Aesthetic visualization is not a photometric plan, electrical design, fixture count, transformer sizing, or code approval."
}
],
"backlog": [
"KitchenSwipe",
"PatioSwipe",
"FenceSwipe",
"DoorSwipe",
"WindowSwipe",
"CabinetSwipe",
"PoolSwipe",
"GarageSwipe"
]
}
The rules every contractor tenant must satisfy before SwipeOS accepts its brand, verticals, privacy settings, catalogs, analytics, or lead routing.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://paintswipe.ai/swipeos/schema/config-v1.json",
"title": "SwipeOS tenant configuration v1",
"type": "object",
"additionalProperties": false,
"required": [
"schema_version",
"state",
"tenant",
"enabled_products",
"verticals",
"lead",
"analytics",
"commerce",
"legal"
],
"properties": {
"schema_version": {
"const": "1.0.0"
},
"state": {
"enum": [
"draft-local",
"review",
"production"
]
},
"tenant": {
"type": "object",
"additionalProperties": false,
"required": [
"slug",
"display_name",
"brand",
"contact",
"territory"
],
"properties": {
"slug": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,63}$"
},
"display_name": {
"type": "string",
"minLength": 2,
"maxLength": 100
},
"brand": {
"type": "object",
"additionalProperties": false,
"required": [
"primary",
"secondary",
"ink"
],
"properties": {
"primary": {
"type": "string",
"pattern": "^#[0-9A-Fa-f]{6}$"
},
"secondary": {
"type": "string",
"pattern": "^#[0-9A-Fa-f]{6}$"
},
"ink": {
"type": "string",
"pattern": "^#[0-9A-Fa-f]{6}$"
},
"logo_url": {
"type": [
"string",
"null"
]
}
}
},
"contact": {
"type": "object",
"additionalProperties": false,
"required": [
"phone",
"email_display"
],
"properties": {
"phone": {
"type": "string"
},
"email_display": {
"type": "string"
},
"response_promise": {
"type": [
"string",
"null"
]
}
}
},
"territory": {
"type": "object",
"additionalProperties": false,
"required": [
"type",
"value"
],
"properties": {
"type": {
"enum": [
"zip-cluster",
"metro",
"regional",
"state",
"national"
]
},
"value": {
"type": "string"
}
}
}
}
},
"enabled_products": {
"type": "array",
"uniqueItems": true,
"minItems": 1,
"items": {
"enum": [
"paint",
"bath",
"siding",
"roof",
"pave",
"deck",
"yard",
"floor",
"light"
]
}
},
"verticals": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"product_id",
"recipe_id",
"catalog_ids",
"features"
],
"properties": {
"product_id": {
"enum": [
"paint",
"bath",
"siding",
"roof",
"pave",
"deck",
"yard",
"floor",
"light"
]
},
"recipe_id": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{2,80}$"
},
"catalog_ids": {
"type": "array",
"uniqueItems": true,
"items": {
"type": "string"
}
},
"features": {
"type": "object",
"additionalProperties": false,
"required": [
"sample_gallery",
"save_magic_link",
"product_links",
"quote_request"
],
"properties": {
"sample_gallery": {
"type": "boolean"
},
"save_magic_link": {
"type": "boolean"
},
"product_links": {
"type": "boolean"
},
"quote_request": {
"type": "boolean"
},
"contractor_match": {
"type": "boolean"
},
"proposal_export": {
"type": "boolean"
}
}
}
}
}
},
"lead": {
"type": "object",
"additionalProperties": false,
"required": [
"consent_required",
"targets"
],
"properties": {
"consent_required": {
"const": true
},
"targets": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"type",
"destination"
],
"properties": {
"type": {
"enum": [
"email",
"webhook",
"crm",
"queue-only"
]
},
"destination": {
"type": "string"
},
"enabled": {
"type": "boolean"
}
}
}
}
}
},
"analytics": {
"type": "object",
"additionalProperties": false,
"required": [
"provider",
"privacy_mode",
"allowed_events"
],
"properties": {
"provider": {
"enum": [
"posthog",
"none"
]
},
"privacy_mode": {
"enum": [
"manual-no-replay-no-person",
"off"
]
},
"allowed_events": {
"type": "array",
"uniqueItems": true,
"items": {
"enum": [
"swipe_tool_viewed",
"swipe_photo_ready",
"swipe_option_selected",
"swipe_render_requested",
"swipe_render_ready",
"swipe_result_saved",
"swipe_product_clicked",
"swipe_quote_requested",
"swipe_contractor_match_requested"
]
}
}
}
},
"commerce": {
"type": "object",
"additionalProperties": false,
"required": [
"affiliate_disclosure_required",
"routes"
],
"properties": {
"affiliate_disclosure_required": {
"const": true
},
"routes": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"type",
"enabled"
],
"properties": {
"type": {
"enum": [
"owned-service",
"contractor-referral",
"affiliate",
"dealer",
"manufacturer-sponsored"
]
},
"enabled": {
"type": "boolean"
}
}
}
}
}
},
"legal": {
"type": "object",
"additionalProperties": false,
"required": [
"concept_only",
"human_review_required",
"disclaimer"
],
"properties": {
"concept_only": {
"const": true
},
"human_review_required": {
"const": true
},
"disclaimer": {
"type": "string",
"minLength": 40
}
}
}
}
}
The BathSwipe recipe: allowed bathroom changes, protected objects, catalog requirements, disclaimers, and visual QC gates.
{
"recipe_version": "1.0.0",
"product_id": "bath",
"public_name": "BathSwipe",
"input": {
"preferred_photo": "Wide doorway view with the full room visible, lights on, and no flash into the mirror.",
"allowed_types": [
"image/jpeg",
"image/png",
"image/webp",
"image/heic"
],
"max_bytes": 20971520
},
"modes": [
"tub-to-shower",
"walk-in-tub",
"accessible-bath",
"acrylic-surround",
"vanity-and-finish"
],
"protected_objects": [
"person",
"window",
"door",
"mirror",
"shower glass",
"plumbing chrome",
"faucet",
"toilet unless selected",
"electrical outlet"
],
"catalog_rules": {
"product_match_required_for_quote": true,
"price_requires_freshness_date": true,
"dealer_cost_never_in_public_payload": true
},
"qc": {
"same_room_identity_required": true,
"protected_object_check": true,
"product_plausibility_check": true,
"human_review_before_customer_delivery": true
},
"disclaimer": "Concept visualization only. Final measurements, plumbing, electrical, accessibility, product availability, installation feasibility, and price require qualified human review."
}
The PaintSwipe recipe: paintable surfaces, identity-preservation rules, real-color constraints, and result checks.
{
"recipe_version": "1.0.0",
"product_id": "paint",
"public_name": "PaintSwipe",
"input": {
"preferred_photo": "Straight, well-lit view with the target surfaces visible and major obstructions minimized.",
"allowed_types": [
"image/jpeg",
"image/png",
"image/webp",
"image/heic"
],
"max_bytes": 20971520
},
"modes": [
"exterior",
"interior",
"commercial"
],
"protected_objects": [
"person",
"window",
"roof unless selected in another product",
"plants",
"sky",
"floor",
"ceiling",
"fixtures",
"furniture"
],
"catalog_rules": {
"manufacturer_color_id_required": true,
"physical_sample_recommended": true,
"screen_color_not_authoritative": true
},
"qc": {
"same_property_identity_required": true,
"surface_coverage_check": true,
"protected_object_check": true,
"human_review_before_customer_delivery": true
},
"disclaimer": "Concept visualization only. Screen color, lighting, substrate, sheen, weather, and application change the result. Confirm the final choice with physical samples and a qualified painter."
}
The first SidingSwipe package: an early recipe that proves new trades can plug into the same platform without a new backend.
{
"recipe_version": "0.1.0",
"product_id": "siding",
"public_name": "SidingSwipe",
"input": {
"preferred_photo": "Full exterior elevation in daylight with siding planes, trim, openings, and roof edges visible.",
"allowed_types": [
"image/jpeg",
"image/png",
"image/webp",
"image/heic"
],
"max_bytes": 20971520
},
"modes": [
"vinyl",
"fiber-cement",
"engineered-wood",
"stone-accent",
"trim"
],
"protected_objects": [
"person",
"window",
"door unless selected",
"roof",
"gutter",
"chimney",
"plants",
"sky",
"masonry unless selected"
],
"catalog_rules": {
"manufacturer_profile_required": true,
"texture_asset_required": true,
"local_availability_state_required": true
},
"qc": {
"same_property_identity_required": true,
"siding_plane_check": true,
"opening_and_trim_check": true,
"human_review_before_customer_delivery": true
},
"disclaimer": "Concept visualization only. Final product availability, wall preparation, flashing, moisture control, measurements, code, installation method, and price require contractor and manufacturer confirmation."
}
The PaveSwipe recipe: address/photo intake, surface modes, protected objects, catalog requirements, driveway-boundary QC, and onsite-review limits.
{
"recipe_version": "0.1.0",
"product_id": "pave",
"public_name": "PaveSwipe",
"input": {
"preferred_photo": "Address-locked street view or a wide daylight photo showing the entire driveway or flatwork area, its edges, sidewalk crossing, curb, garage, and nearby drainage context.",
"allowed_types": [
"image/jpeg",
"image/png",
"image/webp",
"image/heic"
],
"max_bytes": 20971520
},
"modes": [
"asphalt",
"concrete",
"pavers",
"gravel",
"sealcoat",
"driveway",
"sidewalk",
"apron",
"patio",
"parking-area"
],
"protected_objects": [
"person",
"vehicle",
"house",
"garage",
"public sidewalk unless selected",
"curb",
"street",
"lawn",
"landscaping",
"tree",
"fence",
"utility feature",
"neighboring property"
],
"catalog_rules": {
"surface_family_required": true,
"local_supplier_state_required": true,
"manufacturer_or_material_source_required_for_named_products": true,
"installation_system_must_not_be_inferred_from_photo": true
},
"qc": {
"same_property_identity_required": true,
"selected_surface_boundary_check": true,
"public_sidewalk_and_curb_preservation_check": true,
"drainage_claim_check": true,
"human_review_before_customer_delivery": true
},
"disclaimer": "Concept visualization and project-intake aid only. Final dimensions, quantities, base preparation, drainage, grading, thickness, reinforcement, utilities, accessibility, permits, code, schedule, material availability, scope, and price require onsite contractor and applicable professional confirmation."
}
A safe draft tenant showing how Liberty's brand and BathSwipe mode fit the shared schema. It has no live lead destination.
{
"schema_version": "1.0.0",
"state": "draft-local",
"tenant": {
"slug": "liberty-shower-and-bath",
"display_name": "Liberty Shower & Bath",
"brand": {
"primary": "#0057A8",
"secondary": "#EAF4FF",
"ink": "#10233A",
"logo_url": null
},
"contact": {
"phone": "216-310-5599",
"email_display": "REVIEW-BEFORE-LIVE@example.invalid",
"response_promise": "Human follow-up after project review"
},
"territory": {
"type": "regional",
"value": "Greater Cleveland and Northeast Ohio"
}
},
"enabled_products": [
"bath"
],
"verticals": [
{
"product_id": "bath",
"recipe_id": "bath-liberty-acrylic-v1",
"catalog_ids": [
"ellas-bubbles",
"samuel-mueller"
],
"features": {
"sample_gallery": true,
"save_magic_link": false,
"product_links": false,
"quote_request": true,
"contractor_match": false,
"proposal_export": false
}
}
],
"lead": {
"consent_required": true,
"targets": [
{
"type": "queue-only",
"destination": "local-review-queue",
"enabled": true
}
]
},
"analytics": {
"provider": "posthog",
"privacy_mode": "manual-no-replay-no-person",
"allowed_events": [
"swipe_tool_viewed",
"swipe_photo_ready",
"swipe_option_selected",
"swipe_render_requested",
"swipe_render_ready",
"swipe_quote_requested"
]
},
"commerce": {
"affiliate_disclosure_required": true,
"routes": [
{
"type": "owned-service",
"enabled": true
},
{
"type": "affiliate",
"enabled": false
},
{
"type": "manufacturer-sponsored",
"enabled": false
}
]
},
"legal": {
"concept_only": true,
"human_review_required": true,
"disclaimer": "This preview is an illustrative concept, not a measurement, product promise, construction plan, accessibility certification, or binding quote."
}
}
The deterministic gate that verifies nine unique products, correct launch order, valid waves, scores, names, and domain/revenue fields.
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
const here = path.dirname(fileURLToPath(import.meta.url));
const registryPath = path.resolve(here, "..", "PRODUCT_REGISTRY.json");
const registry = JSON.parse(fs.readFileSync(registryPath, "utf8"));
const requiredProducts = ["paint", "bath", "siding", "roof", "pave", "deck", "yard", "floor", "light"];
const ids = registry.products.map((product) => product.id);
const duplicateIds = ids.filter((id, index) => ids.indexOf(id) !== index);
const missingIds = requiredProducts.filter((id) => !ids.includes(id));
const invalidProducts = registry.products.filter((product) => (
!product.id ||
!product.name ||
!product.domain ||
!Number.isInteger(product.wave) ||
!Number.isInteger(product.priority_score) ||
!Array.isArray(product.catalog_targets) ||
!Array.isArray(product.revenue_lanes) ||
!product.risk_note
));
if (registry.schema_version !== "1.0.0") {
throw new Error(`Unexpected schema version: ${registry.schema_version}`);
}
if (duplicateIds.length) {
throw new Error(`Duplicate product ids: ${duplicateIds.join(", ")}`);
}
if (missingIds.length) {
throw new Error(`Missing required product ids: ${missingIds.join(", ")}`);
}
if (invalidProducts.length) {
throw new Error(`Invalid products: ${invalidProducts.map((product) => product.id || "unknown").join(", ")}`);
}
const ordered = [...registry.products].sort((a, b) => b.priority_score - a.priority_score);
const summary = {
ok: true,
schema_version: registry.schema_version,
product_count: registry.products.length,
waves: [...new Set(registry.products.map((product) => product.wave))].sort(),
launch_order: ordered.map((product) => product.name)
};
console.log(JSON.stringify(summary, null, 2));
The platform safety gate that validates the tenant against the schema and checks vertical recipes, privacy mode, and disabled live routing.
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
const supportedProducts = new Set(["paint", "bath", "siding", "roof", "pave", "deck", "yard", "floor", "light"]);
const tenantPath = path.join(root, "swipeos", "tenants", "liberty-bathswipe.example.json");
const verticalDir = path.join(root, "swipeos", "verticals");
const tenant = JSON.parse(fs.readFileSync(tenantPath, "utf8"));
const verticalFiles = fs.readdirSync(verticalDir).filter((name) => name.endsWith(".json"));
const verticals = verticalFiles.map((name) => JSON.parse(fs.readFileSync(path.join(verticalDir, name), "utf8")));
const errors = [];
if (tenant.schema_version !== "1.0.0") errors.push("tenant schema_version must be 1.0.0");
if (tenant.state !== "draft-local") errors.push("example tenant must remain draft-local");
if (!tenant.tenant?.slug || !tenant.tenant?.display_name) errors.push("tenant identity is incomplete");
if (!tenant.lead?.consent_required) errors.push("lead consent must be required");
if (tenant.tenant?.contact?.email_display?.endsWith("@example.invalid") !== true) errors.push("example must keep a non-live email destination");
if (tenant.analytics?.privacy_mode !== "manual-no-replay-no-person") errors.push("example analytics must use the privacy-safe manual mode");
if (tenant.commerce?.affiliate_disclosure_required !== true) errors.push("affiliate disclosure must be required");
if (tenant.legal?.concept_only !== true || tenant.legal?.human_review_required !== true) errors.push("concept and human-review gates must be true");
for (const product of tenant.enabled_products || []) {
if (!supportedProducts.has(product)) errors.push(`unsupported tenant product: ${product}`);
if (!(tenant.verticals || []).some((vertical) => vertical.product_id === product)) errors.push(`enabled product has no vertical config: ${product}`);
}
for (const vertical of verticals) {
if (!supportedProducts.has(vertical.product_id)) errors.push(`unsupported vertical recipe: ${vertical.product_id}`);
if (!vertical.disclaimer || vertical.disclaimer.length < 80) errors.push(`vertical disclaimer too short: ${vertical.product_id}`);
if (!vertical.qc?.human_review_before_customer_delivery) errors.push(`human review missing: ${vertical.product_id}`);
if (!Array.isArray(vertical.protected_objects) || !vertical.protected_objects.length) errors.push(`protected objects missing: ${vertical.product_id}`);
}
const summary = {
ok: errors.length === 0,
tenant: tenant.tenant.slug,
state: tenant.state,
enabled_products: tenant.enabled_products,
vertical_recipes: verticals.map((vertical) => `${vertical.product_id}@${vertical.recipe_version}`).sort(),
privacy_mode: tenant.analytics.privacy_mode,
live_destination_count: tenant.lead.targets.filter((target) => target.enabled && target.type !== "queue-only").length,
errors
};
console.log(JSON.stringify(summary, null, 2));
if (errors.length) process.exit(1);
Every vertical changes the recipe, protected surfaces, catalog, and disclaimer. Tenant identity, uploads, rendering, QC, analytics, lead routing, save/share, and commerce stay shared.
Build in reuse order. Paint and Bath are the proof pair; Siding and Roof create the exterior revenue stack; working PaveSwipe opens a barter-ready paving lane and bridges into Deck/Yard/Light; Floor waits for a strong retailer or installer entry.
Real paint colors on real spaces, routed to the selected painter.
Product-aware bathrooms, accessibility, and remodel quote intent.
Real siding profiles, colors, trim, and exterior accents.
Roof color and product preview with a real measurement/proposal handoff.
Lock the real driveway from an address or photo, then compare asphalt, concrete, pavers, gravel, and sealcoat.
Real board options visualized in the customer's own backyard.
Landscape and outdoor-living concepts constrained by real local services.
One product for carpet, hardwood, tile, vinyl, and laminate.
Day-to-night architectural, landscape, deck, and permanent-light concepts.
The render is the front door. The real product is an attributable path from “I wonder” to a selected material, qualified contractor, and measurable job.
Route supported projects to our businesses and approved clients.
Contractor branding, territory, catalogs, analytics, leads, and CRM handoff.
Match unsupported areas/trades with consent and clean attribution.
Disclosed affiliate, sample, retailer, and dealer links tied to selections.
Manufacturer distribution and sponsored placement after traffic exists.
One approved property photo can create coordinated, multi-trade buying intent instead of ending at one pretty render.
Competitors validate demand—and prove that generic AI imagery is not enough. These are current product claims from their own pages; they are not independent performance proof.
Cross-trade, branded contractor visualizer with custom catalogs and emailed results.
Official page ↗Bathroom photo, style, ZIP-based cost direction, and contractor matching funnel.
Official page ↗Roof and exterior catalog visualization plus measurement, estimating, and proposals.
Current overview ↗Photo-first deck concepts, real board products, and branded proposals.
Official page ↗Fast real-yard landscape concepts for homeowners and contractors.
Official page ↗Strong manufacturer/retailer flooring catalogs and broad dealer distribution.
Official page ↗RDAP observations from August 15–16, 2026. “No record” is not ownership or a guarantee; only registrar checkout confirms availability. No purchase was made.
| Name | .ai | .com | Decision |
|---|---|---|---|
| BathSwipe | No RDAP record | Registered | Recommended bathroom brand |
| TubSwipe | No RDAP record | No RDAP record | Reject: too narrow |
| SidingSwipe | No RDAP record | No RDAP record | Wave 2 working name |
| RoofSwipe | No RDAP record | Registered | Wave 2 working name |
| PaveSwipe | No RDAP record | No RDAP record | Approved working name; proof built |
| DeckSwipe | No RDAP record | Registered | Wave 3; clear archived repo collision |
| YardSwipe | No RDAP record | Registered | Shorter than LandscapeSwipe |
| FloorSwipe | No RDAP record | Registered | Covers carpet too |
| LightSwipe | No RDAP record | Registered | Working name; formal review later |
| HomeSwipe / SwipeHome | Registered | Registered | Avoid active collisions |
Every project Markdown document is rendered below in full—398 source lines total. Open one document at a time or expand the whole library.
Private build packet for turning PaintSwipe into a family of home-improvement visualizers, lead engines, contractor sales tools, and product/catalog commerce surfaces.
https://4-hitech.info/paveswipe/.MARKET_SWEEP_2026-08-15.md — current competitors, whitespace, naming, domain checks, and revenue lanes.PRODUCT_REGISTRY.json — machine-readable product lineup and launch order.SWIPE_OS_ARCHITECTURE.md — one-engine architecture, analytics, catalogs, leads, and combined-project bundles.DESIGN.md — visual DNA for this private review board and future family pages.review/index.html — browser-friendly decision board with voice guidance.swipeos/ — reusable tenant schema, Bath/Paint/Siding/Pave vertical recipes, and a safe Liberty BathSwipe draft config.scripts/validate_registry.mjs — deterministic registry validation.scripts/validate_swipeos.mjs — deterministic safety/config validation for the first shared-platform package.Every new vertical is a mode/config/catalog package on SwipeOS. It does not get a separate backend, lead router, analytics system, or tenant system.
The opportunity is real, but “AI before and after” alone is not a moat anymore. Direct competitors already sell generic or trade-specific visualizers. Our winning position is:
real customer property + real installer catalog + owned contractor lead + cross-vertical SwipeStack + one self-testing platform.
Use BathSwipe.ai.
bathswipe.ai returned no RDAP record on 2026-08-15. That is a preliminary signal only; registrar checkout is the availability authority.bathswipe.com is registered.Do not lead with TubSwipe.
88822767 for TUBSWIPE in cleaning brushes/sponges. It is unrelated and abandoned, but the name brings no benefit worth the extra baggage.tubswipe.com returned no RDAP record, but a cheap open .com does not make the weaker name strategically better.Use The Swipe Collection as the working family label and SwipeOS internally. Avoid HomeSwipe/SwipeHome: both .ai names are registered and HomeSwipe is in active public use for real-estate products.
Use PaveSwipe as the working category name.
paveswipe.ai and paveswipe.com returned no RDAP record on 2026-08-16. This is a preliminary signal only; registrar checkout is the authority. No domain was purchased.Checked through Verisign .com RDAP and Identity Digital .ai RDAP on 2026-08-15. “No RDAP record” is not a purchase guarantee. No domain was purchased.
| Product | .ai |
.com |
Call |
|---|---|---|---|
| BathSwipe | no RDAP record | registered | .ai primary; do not chase .com |
| TubSwipe | no RDAP record | no RDAP record | reject as main brand |
| RoofSwipe | no RDAP record | registered | .ai working name |
| SidingSwipe | no RDAP record | no RDAP record | .ai working name; .com defensive only if later approved |
| DeckSwipe | no RDAP record | registered | .ai working name; preliminary name search found an archived card-game repo |
| FloorSwipe | no RDAP record | registered | .ai working name; include carpet rather than split it |
| CarpetSwipe | no RDAP record | no RDAP record | do not fragment FloorSwipe |
| YardSwipe | no RDAP record | registered | shorter than LandscapeSwipe; preliminary clearance still required |
| LandscapeSwipe | no RDAP record | no RDAP record | descriptive but clunky |
| LightSwipe | no RDAP record | registered | working name; do a formal mark review before purchase/launch |
| PaveSwipe | no RDAP record | no RDAP record | approved working name; private proof built first |
| SwipeSuite | no RDAP record | registered | do not buy yet; working family does not need another domain |
| HomeSwipe | registered | registered | avoid; active public collision |
| SwipeHome | registered | registered | avoid |
Implication: our pitch cannot be “we have AI.” It must be product accuracy, local lead ownership, cross-trade coordination, privacy-safe analytics, and verified working pages.
Gap we can own: Liberty/contractor-specific inventory, accessible-bath products, locally routed quote requests, dealer/SKU context, and no third-party contractor marketplace taking the lead.
Gap we can own: fast one-photo concept plus local contractor lead, then handoff into measurement/proposal tools rather than pretending the render is a measurement system. The bigger moat is a coordinated roof + siding + paint + lighting Exterior Stack.
Gap we can own: multi-tenant contractor lead capture and a combined Deck + Yard + Lighting outdoor package. We should not claim structural design.
Gap we can own: combine PaintSwipe's address-to-street-view lock with a driveway-specific surface comparison and contractor-ready project worksheet. The trade website becomes useful before the contractor has photography, a catalog, or a CRM. The honest handoff is visual direction first, onsite measurement and quote second.
Gap we can own: local nursery/material catalogs, plant/climate constraints, specific contractor service menus, and cross-sell with decks, patios, lighting, paint, and siding.
Gap we can own: the lighting preview embedded in a whole-exterior project, privacy-safe lead capture, and local fixture/install catalogs. Pure lighting visualization by itself is already competitive.
Gap we can own: do not attack as another generic floor visualizer. Enter with local installer leads, a combined bath/interior package, and clear product/sample routing. FloorSwipe should cover carpet rather than creating CarpetSwipe.
Primary/current product pages read on 2026-08-15:
Search and registry evidence:
.com RDAP — https://rdap.verisign.com/com/v1/.ai RDAP — https://rdap.identitydigital.services/rdap/This is a business/product scan and preliminary naming screen, not a legal trademark opinion or availability guarantee.
Do not make nine products as nine codebases. Build one multi-tenant visual-commerce and lead platform with vertical-specific mode packages.
homeowner photo/address
|
v
photo readiness + permission gate
|
v
vertical recipe (paint / bath / siding / roof / pave / deck / yard / floor / light)
|
+--> protected-object rules
+--> real product/catalog constraints
+--> render engine route
+--> Super Glasses visual/technical QC
|
v
before/after + selected products + concept disclaimer
|
+--> save/share magic link
+--> buy/sample/affiliate links
+--> contractor quote or match
+--> branded proposal
Most competitors solve one trade or provide a generic makeover. SwipeStack lets one approved property photo become a coordinated package:
This creates cross-sell value that single-category visualizers do not naturally capture.
PaveSwipe inherits PaintSwipe's lowest-friction property intake instead of asking every visitor to find a good photo first:
The address is used only to find the property image in the browser. It must not enter privacy analytics. Locking a view identifies the visual target; it does not measure the driveway or prove boundaries, drainage, grading, base condition, utilities, or ownership.
Track behavior and funnel state, not private project content.
swipe_tool_viewed — vertical, tenant, anonymous session class.swipe_photo_ready — vertical and input type only; never image, filename, URL, address, EXIF, or contact data.swipe_option_selected — vertical and controlled option ID/SKU only.swipe_render_requested — vertical and recipe version.swipe_render_ready — vertical, latency bucket, QC state.swipe_result_saved — vertical; no magic token.swipe_product_clicked — vertical, merchant/manufacturer, controlled SKU, disclosure state.swipe_quote_requested — vertical and tenant; contact stays in the lead system, not analytics.swipe_contractor_match_requested — vertical and territory bucket, not exact address.Use no autocapture, session replay, typed-text capture, photo capture, contact fields, persistent person profile, or full URL/referrer where project tokens can appear.
Keep every revenue role labeled. An affiliate click, paid catalog placement, contractor match, and owned job are not the same thing.
Do not publish pricing yet. Test this privately against real prospects:
Workshop control board with a spectrum edge. The page should feel like the PaintSwipe brand expanded into a product factory: dark graphite canvas, bright white working cards, violet control highlights, and a thin multicolor swipe ribbon.
#090b14#111522#f7f7fb#141522#667085#7c5cff#5436e8#16845b#b66a00#f4c430 on asphalt black #111318; keep Swipe violet as the family-link color.The common platform, product registry, BathSwipe source adaptation, PaveSwipe proof, and private prototypes are active build work. Domains, public brand claims, affiliate applications, manufacturer outreach, and paid/public launch remain approval steps.
The ninth product now demonstrates the address-first driveway playbook, five surface directions, a contractor website, and safe project intake without inventing a contractor identity or price.