← back to AbramsEgo
auto-save: 2026-07-01T18:38:06 (8 files) — data/local-fleet.json data/revenue.json public/index.html public/landing.html server.js
1c592313f126222fd49047c19bab972c30d53568 · 2026-07-01 18:38:07 -0700 · Steve Abrams
Files touched
A data/affiliate-clicks.jsonlM data/local-fleet.jsonM data/revenue.jsonA data/wpb-licensing-catalog.jsonA memos/licensing-channels.mdM public/index.htmlM public/landing.htmlM server.js
Diff
commit 1c592313f126222fd49047c19bab972c30d53568
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Wed Jul 1 18:38:07 2026 -0700
auto-save: 2026-07-01T18:38:06 (8 files) — data/local-fleet.json data/revenue.json public/index.html public/landing.html server.js
---
data/affiliate-clicks.jsonl | 1 +
data/local-fleet.json | 2 +-
data/revenue.json | 9 +-
data/wpb-licensing-catalog.json | 777 ++++++++++++++++++++++++++++++++++++++++
memos/licensing-channels.md | 72 ++++
public/index.html | 2 +-
public/landing.html | 150 ++++++++
server.js | 26 +-
8 files changed, 1033 insertions(+), 6 deletions(-)
diff --git a/data/affiliate-clicks.jsonl b/data/affiliate-clicks.jsonl
new file mode 100644
index 0000000..5f8aa25
--- /dev/null
+++ b/data/affiliate-clicks.jsonl
@@ -0,0 +1 @@
+{"ts":"2026-07-02T01:37:20.097Z","slug":"digitalocean","ua":"curl/8.7.1","ref":""}
diff --git a/data/local-fleet.json b/data/local-fleet.json
index 7b15295..f281d7d 100644
--- a/data/local-fleet.json
+++ b/data/local-fleet.json
@@ -1 +1 @@
-{"fetchedAt":"2026-07-02T01:07:57.246Z","procs":[{"name":"api-token-dashboard","status":"online","cpu":0,"memMB":48,"restarts":null,"uptimeMs":7835000,"startedAt":"2026-07-01T22:57:22.246Z"},{"name":"abramsego","status":"stopped","cpu":null,"memMB":null,"restarts":null,"uptimeMs":null,"startedAt":null}]}
\ No newline at end of file
+{"fetchedAt":"2026-07-02T01:38:06.721Z","procs":[{"name":"api-token-dashboard","status":"online","cpu":0,"memMB":49,"restarts":null,"uptimeMs":9644000,"startedAt":"2026-07-01T22:57:22.721Z"},{"name":"abramsego","status":"stopped","cpu":null,"memMB":null,"restarts":null,"uptimeMs":null,"startedAt":null}]}
\ No newline at end of file
diff --git a/data/revenue.json b/data/revenue.json
index 0eb7d86..7540e45 100644
--- a/data/revenue.json
+++ b/data/revenue.json
@@ -1,5 +1,5 @@
{
- "updatedAt": "2026-07-01T17:13:33.202Z",
+ "updatedAt": "2026-07-02T01:26:08.138Z",
"engines": [
{
"key": "sell_product",
@@ -28,6 +28,13 @@
"status": "gated",
"amount": 0,
"note": "ad network + public site — awaiting Steve go-live"
+ },
+ {
+ "key": "licensing",
+ "label": "License WPB designs (B2B/marketplaces)",
+ "status": "gated",
+ "amount": 0,
+ "note": "catalog built — awaiting Steve channel signups"
}
]
}
\ No newline at end of file
diff --git a/data/wpb-licensing-catalog.json b/data/wpb-licensing-catalog.json
new file mode 100644
index 0000000..60cea5f
--- /dev/null
+++ b/data/wpb-licensing-catalog.json
@@ -0,0 +1,777 @@
+{
+ "generatedAt": "2026-07-02T01:25:00.461Z",
+ "source": "https://wallpapersback.com/api/designs (read-only GET; LIVE published designs only)",
+ "eligibility": "Only designs LIVE on wallpapersback.com (settlement-passed + published, user_removed=false) are eligible. Unpublished/removed designs are never included.",
+ "pricingNote": "ALL PRICING IS DRAFT — indicative only, nothing is listed or offered for sale. Steve approves channels + pricing before any listing or outreach.",
+ "count": 24,
+ "designs": [
+ {
+ "id": 57710,
+ "title": "Greige Carouse No.57710",
+ "category": "drunk-animals",
+ "kind": "seamless_tile",
+ "dominantHex": null,
+ "createdAt": "2026-06-09T19:58:01.387737+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/57710",
+ "wpbUrl": "https://wallpapersback.com/design/57710",
+ "styleLine": "Revelrous animal characters mid-carouse on a soft greige ground — conversation-piece whimsy with a neutral palette that still behaves in a real room.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 56250,
+ "title": "Chamois Atelier No.56250",
+ "category": "muybridge-plate · saddle-mocha",
+ "kind": "seamless_tile",
+ "dominantHex": "#fdf9e7",
+ "createdAt": "2026-06-02T15:21:03.69746+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/56250",
+ "wpbUrl": "https://wallpapersback.com/design/56250",
+ "styleLine": "Muybridge-style sequential motion plates in saddle-mocha on chamois — a scholarly, gallery-wall rhythm for studies, bars and menswear-leaning spaces.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 40178,
+ "title": "Apricot Folio No.40178",
+ "category": "chinoiserie · champagne-linen",
+ "kind": "seamless_tile",
+ "dominantHex": "#D9C7B1",
+ "createdAt": "2026-05-25T00:39:15.088479+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/40178",
+ "wpbUrl": "https://wallpapersback.com/design/40178",
+ "styleLine": "Hand-painted-look chinoiserie branches drifting across a champagne-linen ground — classic East-meets-West elegance in warm apricot neutrals.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 57669,
+ "title": "Chamois Reverie No.57669",
+ "category": "monterey-mural",
+ "kind": "mural_panel",
+ "dominantHex": "#c9b99c",
+ "createdAt": "2026-06-04T07:06:59.658824+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/57669",
+ "wpbUrl": "https://wallpapersback.com/design/57669",
+ "styleLine": "Full-wall Monterey coastal reverie in sun-washed chamois — a panel mural that reads as fine-art scenery rather than repeat wallpaper.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 249,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 795,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 4500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 40172,
+ "title": "Oxblood Origin No.40172",
+ "category": "stripe · oxblood",
+ "kind": "seamless_tile",
+ "dominantHex": "#802424",
+ "createdAt": "2026-05-25T00:36:21.550418+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/40172",
+ "wpbUrl": "https://wallpapersback.com/design/40172",
+ "styleLine": "A disciplined heritage stripe in deep oxblood — tailored, masculine, and instantly at home in libraries, halls and hospitality corridors.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 54111,
+ "title": "Chamois Studio No.54111",
+ "category": "designer-zoo-calm",
+ "kind": "seamless_tile",
+ "dominantHex": "#e3ded4",
+ "createdAt": "2026-05-28T17:38:18.705988+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/54111",
+ "wpbUrl": "https://wallpapersback.com/design/54111",
+ "styleLine": "A serene designer-zoo menagerie in muted chamois — calm, illustrative animals with the restraint of a high-end nursery-to-study crossover.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 7448,
+ "title": "Foxes Slumber in Bottle Green",
+ "category": "stoned-animals",
+ "kind": "seamless_tile",
+ "dominantHex": "#3e603c",
+ "createdAt": "2026-05-14T21:46:02.99694+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/7448",
+ "wpbUrl": "https://wallpapersback.com/design/7448",
+ "styleLine": "Heavy-lidded foxes slumbering in bottle green — moody storybook charm with saturated, jewel-box color.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 10024,
+ "title": "Greige Reverie No.10024",
+ "category": "inspired",
+ "kind": "seamless_tile",
+ "dominantHex": "#938f85",
+ "createdAt": "2026-05-20T07:16:31.92345+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/10024",
+ "wpbUrl": "https://wallpapersback.com/design/10024",
+ "styleLine": "A heritage-inspired abstract in layered greige — quiet, textural pattern that flatters furniture instead of fighting it.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 57678,
+ "title": "Terracotta Atelier No.57678",
+ "category": "damask",
+ "kind": "seamless_tile",
+ "dominantHex": "#423730",
+ "createdAt": "2026-06-04T16:04:07.982096+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/57678",
+ "wpbUrl": "https://wallpapersback.com/design/57678",
+ "styleLine": "Traditional damask reworked in terracotta and umber — old-world formality with an earthy, contemporary temperature.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 57718,
+ "title": "Chamois Folio No.57718",
+ "category": "cactus",
+ "kind": "seamless_tile",
+ "dominantHex": "#f1e5c9",
+ "createdAt": "2026-06-09T20:18:38.448608+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/57718",
+ "wpbUrl": "https://wallpapersback.com/design/57718",
+ "styleLine": "Desert cactus silhouettes on warm chamois — southwestern character kept polite enough for coastal and transitional rooms.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 38848,
+ "title": "Greige Folio No.38848",
+ "category": "cactus-11ft-mural",
+ "kind": "mural",
+ "dominantHex": "#7d7972",
+ "createdAt": "2026-05-21T21:03:03.164563+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/38848",
+ "wpbUrl": "https://wallpapersback.com/design/38848",
+ "styleLine": "An 11-foot floor-to-ceiling cactus mural in soft greige — sculptural desert scale for feature walls and lobbies.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 249,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 795,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 4500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 138,
+ "title": "Apricot Garden No.138",
+ "category": "floral",
+ "kind": "seamless_tile",
+ "dominantHex": "#e5bfac",
+ "createdAt": "2026-05-12T04:45:45.035538+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/138",
+ "wpbUrl": "https://wallpapersback.com/design/138",
+ "styleLine": "A soft apricot garden floral — romantic, painterly blooms with vintage-print warmth.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 40138,
+ "title": "Chamois Folio No.40138",
+ "category": "designer-scenic · chamois",
+ "kind": "seamless_tile",
+ "dominantHex": "#F5F1E4",
+ "createdAt": "2026-05-25T00:17:04.77785+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/40138",
+ "wpbUrl": "https://wallpapersback.com/design/40138",
+ "styleLine": "A scenic panoramic toile in chamois — pastoral storytelling in a single sweeping colorway.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 57717,
+ "title": "Prussian Origin No.57717",
+ "category": "geometric-block-leaves",
+ "kind": "seamless_tile",
+ "dominantHex": "#021233",
+ "createdAt": "2026-06-09T20:16:56.941806+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/57717",
+ "wpbUrl": "https://wallpapersback.com/design/57717",
+ "styleLine": "Block-printed leaf geometry on deep Prussian blue — graphic, wood-block texture with serious nighttime drama.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 57705,
+ "title": "Greige Lattice No.57705",
+ "category": "geometric",
+ "kind": "seamless_tile",
+ "dominantHex": null,
+ "createdAt": "2026-06-09T19:35:56.28038+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/57705",
+ "wpbUrl": "https://wallpapersback.com/design/57705",
+ "styleLine": "A greige lattice geometric — architectural trellis order that layers under art and millwork effortlessly.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 54049,
+ "title": "Celadon Reverie No.54049",
+ "category": "drunk-monkeys-v2",
+ "kind": "seamless_tile",
+ "dominantHex": "#8bc17d",
+ "createdAt": "2026-05-28T13:32:04.189382+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/54049",
+ "wpbUrl": "https://wallpapersback.com/design/54049",
+ "styleLine": "Playful monkeys tumbling across a celadon ground — chinoiserie mischief in a fresh botanical green.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 57688,
+ "title": "Sloths Saunter in Greige",
+ "category": "drunk-animals",
+ "kind": "seamless_tile",
+ "dominantHex": null,
+ "createdAt": "2026-06-09T19:16:22.518518+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/57688",
+ "wpbUrl": "https://wallpapersback.com/design/57688",
+ "styleLine": "Sloths sauntering through a greige canopy — slow-living humor rendered in grown-up neutrals.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 56249,
+ "title": "Chamois Reverie No.56249",
+ "category": "muybridge-plate · saddle-mocha",
+ "kind": "seamless_tile",
+ "dominantHex": "#fdf9e7",
+ "createdAt": "2026-06-02T15:21:01.66356+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/56249",
+ "wpbUrl": "https://wallpapersback.com/design/56249",
+ "styleLine": "A second Muybridge motion-study plate in chamois reverie — sepia sequences with archival, printed-page character.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 40177,
+ "title": "Chamois Origin No.40177",
+ "category": "chinoiserie · smoke-ash",
+ "kind": "seamless_tile",
+ "dominantHex": "#DED7C1",
+ "createdAt": "2026-05-25T00:38:48.585999+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/40177",
+ "wpbUrl": "https://wallpapersback.com/design/40177",
+ "styleLine": "Chinoiserie branchwork in smoke-ash over warm chamois — softened contrast for bedrooms and quiet dining rooms.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 57668,
+ "title": "Chamois Folio No.57668",
+ "category": "monterey-mural",
+ "kind": "mural_panel",
+ "dominantHex": "#f3edde",
+ "createdAt": "2026-06-04T07:04:38.110538+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/57668",
+ "wpbUrl": "https://wallpapersback.com/design/57668",
+ "styleLine": "A companion Monterey mural panel in pale chamois — airy coastal scenery for multi-panel installations.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 249,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 795,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 4500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 40171,
+ "title": "Honey Studio No.40171",
+ "category": "stripe · antique-brass",
+ "kind": "seamless_tile",
+ "dominantHex": "#B49555",
+ "createdAt": "2026-05-25T00:35:57.822834+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/40171",
+ "wpbUrl": "https://wallpapersback.com/design/40171",
+ "styleLine": "A honeyed stripe in antique brass — warm metallic-leaning bands with old-hotel polish.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 54109,
+ "title": "Chamois Reverie No.54109",
+ "category": "designer-zoo-calm",
+ "kind": "seamless_tile",
+ "dominantHex": "#c3bfaa",
+ "createdAt": "2026-05-28T17:29:36.439473+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/54109",
+ "wpbUrl": "https://wallpapersback.com/design/54109",
+ "styleLine": "Designer-zoo calm in deeper chamois — the menagerie line in a moodier, tea-stained neutral.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 7445,
+ "title": "Raccoons Drift in Claret",
+ "category": "stoned-animals",
+ "kind": "seamless_tile",
+ "dominantHex": "#76443a",
+ "createdAt": "2026-05-14T21:44:36.210008+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/7445",
+ "wpbUrl": "https://wallpapersback.com/design/7445",
+ "styleLine": "Raccoons drifting in claret — rich wine-dark ground with sly, characterful wildlife.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ },
+ {
+ "id": 10006,
+ "title": "Greige Studio No.10006",
+ "category": "inspired",
+ "kind": "seamless_tile",
+ "dominantHex": "#697072",
+ "createdAt": "2026-05-20T07:15:16.412401+00:00",
+ "img": "https://wallpapersback.com/designs/img/by-id/10006",
+ "wpbUrl": "https://wallpapersback.com/design/10006",
+ "styleLine": "An inspired abstract study in cool greige — smoky, mineral tones for modern minimal interiors.",
+ "licenseTiers": [
+ {
+ "tier": "digital_single_use",
+ "label": "Digital single-use license",
+ "priceUsd": 149,
+ "terms": "one product / one campaign, non-exclusive, no resale of the file"
+ },
+ {
+ "tier": "commercial_print",
+ "label": "Commercial print license",
+ "priceUsd": 495,
+ "terms": "print-on-demand & physical goods, non-exclusive, attribution optional"
+ },
+ {
+ "tier": "exclusive",
+ "label": "Exclusive license",
+ "priceUsd": 2500,
+ "terms": "category-exclusive buyout, design retired from other channels"
+ }
+ ],
+ "pricingStatus": "DRAFT"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/memos/licensing-channels.md b/memos/licensing-channels.md
new file mode 100644
index 0000000..7142af7
--- /dev/null
+++ b/memos/licensing-channels.md
@@ -0,0 +1,72 @@
+# Engine 5 — License Wallpaper's Back designs (channel strategy, ALL GATED)
+
+**Created:** 2026-07-01 · **Owner:** vp-abramsego (engine) / vp-special-projects (WPB catalog) · **Status:** DRAFT — every channel below is a Steve-gated switch. Nothing is signed up, listed, or contacted.
+
+> Feeds task 41's consolidated go-live approval memo. If that memo exists at
+> `~/.claude/yolo-queue/pending-approval/abramsego-golive-260701.md`, append this as its
+> **"5. licensing"** switch section (autonomous writes to that path are harness-blocked,
+> so it lives in-repo until Steve or task 41 moves it).
+
+## What's built (local, non-gated)
+- `data/wpb-licensing-catalog.json` — 24 designs cached from the **read-only** public feed
+ `https://wallpapersback.com/api/designs`. Selection round-robins across all 16 live style
+ families (chinoiserie, muybridge-plate, drunk-animals, designer-zoo-calm, monterey-mural,
+ stripe, damask, cactus, floral, scenic, geometrics, …) for maximum variety.
+ **Eligibility hard rail honored:** only designs LIVE on wallpapersback.com
+ (`is_published: true`, `user_removed: false` — i.e. already settlement-passed + published).
+ No WPB DB writes, no WPB deploys, images stay WPB-hosted.
+- LLM licensing copy per design: 1-line style description + 3 DRAFT tiers
+ (digital single-use $149 / commercial print $495 / exclusive $2,500; murals $249/$795/$4,500).
+- Landing section "License our original designs" on `/landing` (still behind Basic Auth,
+ `PUBLIC_LANDING=0`): sortable (Newest/Color/Style/SKU/Title) + density slider, both
+ localStorage-persisted per Steve's grid rules; inquiry CTA → `POST /api/waitlist`
+ with `source:"licensing"` + tier(+design id).
+- Engine pill 5 `licensing` in the revenue registry, gated; flips live only when real
+ income lands via `/api/revenue/record`.
+
+## Ranked channels (each = one Steve switch)
+
+### 1. Print-on-demand marketplaces (fastest to first dollar, lowest lift)
+| Channel | What it requires | Revenue mechanics |
+|---|---|---|
+| **Spoonflower** | Artist account, upload seamless tiles (already print-clean at 150 DPI from the WPB pipeline), set designs "for sale" | ~10–15% commission on wallpaper/fabric/home goods sold; passive after upload |
+| **Society6 / Redbubble** | Artist account, upload square art files | ~10% base margin (S6), artist-set markups (RB); wallpaper + adjacent products (pillows, art prints) |
+| **Creative Market / Adobe Stock (patterns)** | Shop approval, package tiles as digital pattern files | 50–70% of each digital sale; sells the FILE (digital single-use tier) — decide first whether digital-file sales are acceptable vs. print-only |
+
+**Risk note:** marketplace uploads grant those platforms broad display/print licenses and price
+anchors (~$5–20 digital). If exclusivity deals (tier 3) matter, keep the exclusive-eligible
+subset OFF marketplaces — the two models conflict per-design.
+
+### 2. Etsy shop — digital + fulfilled-by-WPB (own the customer)
+- Requires: Etsy seller account (~$0.20/listing), listing fees + ~6.5% transaction fee.
+- Sell printed-roll orders fulfilled through the existing WPB print pipeline, and/or digital
+ license downloads. Higher margin than POD marketplaces; more ops (customer service).
+- Natural A/B: list the same 24-design licensing catalog and see which families pull.
+
+### 3. B2B licensing outreach (highest $/deal, slowest)
+- Targets: boutique hotel/hospitality procurement, interior-design studios, wallpaper
+ manufacturers hunting fresh collections (the inverse of DW's vendor relationships — Steve
+ already knows which houses buy outside art), stationery/textile brands.
+- Requires: a one-page licensing sheet (the catalog JSON + landing section IS the pitch page),
+ outreach emails — **send-to-list is hard-gated**, drafts only until Steve approves.
+- Mechanics: flat license fees per the tier sheet, or royalty (5–10% of wholesale) for
+ collections. Exclusives ($2.5k–$4.5k draft) retire the design from other channels.
+
+### 4. Patternbank / WGSN-adjacent design marketplaces (trade-facing)
+- Requires: portfolio application; they curate.
+- Mechanics: site sells the design (often exclusive transfer) at trade prices ($150–$500+),
+ takes ~30–50%. Good clearing house for designs that don't move on consumer channels.
+
+## Suggested first move (when Steve flips a switch)
+Spoonflower first: zero listing cost, the WPB pipeline already outputs seamless
+150-DPI-clean tiles, and it validates per-family demand before any B2B outreach. Etsy second.
+B2B outreach only once there's a sales screenshot to point at.
+
+## The switch (what Steve approves)
+- [ ] APPROVE channel(s): Spoonflower / S6-RB / Creative Market / Etsy / B2B outreach / Patternbank
+- [ ] APPROVE or REVISE draft tier pricing (marked DRAFT everywhere until then)
+- [ ] Decide: digital-file sales allowed, or print-only?
+- [ ] Which designs (if any) reserved exclusive-only (kept off marketplaces)?
+
+Until all four are answered: catalog + landing stay local-only behind auth; no accounts, no
+listings, no outreach, no WPB writes.
diff --git a/public/index.html b/public/index.html
index 15a0d72..04b5ca9 100644
--- a/public/index.html
+++ b/public/index.html
@@ -105,7 +105,7 @@
<h2>💰 Self-Funding P&L <span class="muted" id="pnlwin">· today</span></h2>
<div class="pnlgrid">
<div class="stat"><div class="k">Cost today</div><div class="v" id="pnl-cost">—</div><div class="muted" id="pnl-cost-sub"></div></div>
- <div class="stat"><div class="k">Revenue today</div><div class="v gold" id="pnl-rev">—</div><div class="muted">4 engines · gated</div></div>
+ <div class="stat"><div class="k">Revenue today</div><div class="v gold" id="pnl-rev">—</div><div class="muted">5 engines · gated</div></div>
<div class="stat"><div class="k">Net</div><div class="v" id="pnl-net">—</div><div class="muted">revenue − cost</div></div>
<div class="stat"><div class="k">Self-funding</div><div class="v" id="pnl-pct">—</div><div class="muted">of run cost covered</div></div>
</div>
diff --git a/public/landing.html b/public/landing.html
index 5965932..fee8a1b 100644
--- a/public/landing.html
+++ b/public/landing.html
@@ -86,6 +86,25 @@
.wl input:focus{outline:none;border-color:var(--accent)}
.wl .msg{margin-top:12px;font-size:12px;min-height:16px}
.wl .msg.ok{color:var(--good)}.wl .msg.err{color:var(--bad)}
+ /* — licensing grid (engine 5) — sort + density per Steve's grid rules — */
+ .lic-controls{display:flex;gap:22px;align-items:center;margin:0 0 18px;font-size:12px;color:var(--dim)}
+ .lic-controls label{display:flex;gap:8px;align-items:center}
+ .lic-controls select{background:#0c1420;border:1px solid var(--line);color:var(--ink);
+ border-radius:8px;padding:7px 10px;font-family:var(--mono);font-size:12px}
+ .lic-controls input[type=range]{accent-color:var(--accent);width:130px}
+ .lic-grid{display:grid;grid-template-columns:repeat(var(--lic-cols,4),1fr);gap:14px}
+ @media(max-width:760px){.lic-grid{grid-template-columns:repeat(2,1fr)}}
+ .lic-card{background:linear-gradient(180deg,var(--panel),var(--panel2));border:1px solid var(--line);
+ border-radius:12px;overflow:hidden;display:flex;flex-direction:column}
+ .lic-card img{width:100%;aspect-ratio:1/1;object-fit:cover;display:block;background:#0c1420}
+ .lic-card .b{padding:12px 14px;display:flex;flex-direction:column;gap:6px;flex:1}
+ .lic-card .t{font-size:13px;font-weight:700}
+ .lic-card .d{font-size:11px;color:var(--dim);flex:1}
+ .lic-card .tiers-line{font-size:10px;color:var(--gold)}
+ .lic-card .row{display:flex;gap:8px;align-items:center;justify-content:space-between;margin-top:4px}
+ .lic-card .row a{font-size:11px}
+ #lic-form select{background:#0c1420;border:1px solid var(--line);color:var(--ink);
+ border-radius:9px;padding:12px 10px;font-family:var(--mono);font-size:13px}
footer{max-width:1120px;margin:0 auto;padding:26px 20px;color:var(--dim);font-size:11px;
display:flex;gap:14px;flex-wrap:wrap;align-items:center}
.tag{font-size:10px;color:var(--warn);border:1px solid #ffb45444;background:#ffb4540f;
@@ -99,6 +118,7 @@
<nav class="nav">
<a href="#features">Features</a>
<a href="#pricing">Pricing</a>
+ <a href="#licensing">Licensing</a>
<a href="/index.html">Live demo →</a>
<a href="/api/report/sample">Sample report</a>
<a class="btn ghost" href="#waitlist">Join waitlist</a>
@@ -226,6 +246,49 @@
<p class="pricing-note" id="pricing-note">Prices indicative · billing not yet live — join the waitlist and you'll be first to know when checkout opens.</p>
</section>
+ <!-- LICENSING (engine 5) — original Wallpaper's Back designs available to
+ license. Grid is fed by /api/licensing/catalog (a read-only cache of
+ designs LIVE on wallpapersback.com); prices are DRAFT copy only and the
+ inquiry CTA just posts to the waitlist — no sale happens here. -->
+ <section id="licensing">
+ <div class="kicker">Original designs · licensing</div>
+ <h2>License our original designs</h2>
+ <p class="sub">Every pattern below is an original, live on
+ <a href="https://wallpapersback.com" target="_blank" rel="noopener noreferrer">Wallpaper's Back</a> —
+ our AI-assisted, human-curated wallpaper studio. License them for your own products,
+ print runs, or campaigns. <span class="tag">Pricing DRAFT — inquiries only</span></p>
+ <div class="lic-controls">
+ <label>Sort
+ <select id="lic-sort">
+ <option value="newest">Newest</option>
+ <option value="color">Color</option>
+ <option value="style">Style</option>
+ <option value="sku">SKU A→Z</option>
+ <option value="title">Title A→Z</option>
+ </select>
+ </label>
+ <label>Density
+ <input id="lic-density" type="range" min="2" max="6" step="1" value="4" />
+ </label>
+ </div>
+ <div class="lic-grid" id="lic-grid"></div>
+ <div class="wl" id="lic-inquiry" style="margin-top:30px">
+ <div class="kicker" style="margin-bottom:8px">License inquiry</div>
+ <h2 style="margin-bottom:6px;font-size:19px">Ask about a design</h2>
+ <p class="sub" style="margin:0" id="lic-context">Pick a design above, or send a general licensing inquiry.</p>
+ <form id="lic-form">
+ <input id="lic-email" type="email" required autocomplete="email" placeholder="you@brand.com" />
+ <select id="lic-tier">
+ <option value="digital_single_use">Digital single-use</option>
+ <option value="commercial_print" selected>Commercial print</option>
+ <option value="exclusive">Exclusive</option>
+ </select>
+ <button class="btn gold" type="submit">Send inquiry</button>
+ </form>
+ <div class="msg" id="lic-msg"></div>
+ </div>
+ </section>
+
<!-- WAITLIST -->
<section id="waitlist">
<div class="wl">
@@ -361,6 +424,93 @@ const usd = (n)=> n==null? '—' : '$'+Number(n).toFixed(n<1?4:2);
}catch(e){ /* house ad stays */ }
})();
+// Licensing grid (engine 5) ← GET /api/licensing/catalog. Sort + density
+// controls persist in localStorage (Steve's hard rule for grids >12 items).
+// Inquiry posts to /api/waitlist with source:"licensing" — interest capture
+// only; actual listings/outreach stay Steve-gated.
+(async function licensing(){
+ const sec=$('licensing'), grid=$('lic-grid');
+ let designs=[];
+ try{
+ const j = await (await fetch('/api/licensing/catalog')).json();
+ designs = (j && j.designs) || [];
+ }catch(e){}
+ if(!designs.length){ sec.hidden = true; return; }
+
+ // color buckets for the Color sort: white → warm → green → blue → purple → dark
+ function colorBucket(hex){
+ if(!hex) return 9;
+ const n=parseInt(hex.replace('#',''),16); if(isNaN(n)) return 9;
+ const r=(n>>16&255)/255, g=(n>>8&255)/255, b=(n&255)/255;
+ const mx=Math.max(r,g,b), mn=Math.min(r,g,b), l=(mx+mn)/2, d=mx-mn;
+ if(l>0.86) return 0; // white/cream
+ if(l<0.16) return 8; // near-black
+ if(d<0.08) return 7; // gray/greige
+ let h=0;
+ if(mx===r) h=((g-b)/d)%6; else if(mx===g) h=(b-r)/d+2; else h=(r-g)/d+4;
+ h=(h*60+360)%360;
+ if(h<70||h>=330) return 1; // warm (red/orange/yellow)
+ if(h<170) return 2; // green
+ if(h<260) return 3; // blue
+ return 4; // purple
+ }
+ const sorters={
+ newest:(a,b)=>new Date(b.createdAt)-new Date(a.createdAt),
+ color:(a,b)=>colorBucket(a.dominantHex)-colorBucket(b.dominantHex)||a.id-b.id,
+ style:(a,b)=>(a.category||'').localeCompare(b.category||'')||a.id-b.id,
+ sku:(a,b)=>String(a.id).localeCompare(String(b.id),undefined,{numeric:true}),
+ title:(a,b)=>(a.title||'').localeCompare(b.title||''),
+ };
+ const sortSel=$('lic-sort'), dens=$('lic-density');
+ sortSel.value = localStorage.getItem('lic-sort') || 'newest';
+ dens.value = localStorage.getItem('lic-cols') || '4';
+ function usd0(n){ return '$'+Number(n).toLocaleString(); }
+ let picked=null; // {id,title} from a card's Inquire button
+ function render(){
+ localStorage.setItem('lic-sort', sortSel.value);
+ localStorage.setItem('lic-cols', dens.value);
+ grid.style.setProperty('--lic-cols', dens.value);
+ const list=[...designs].sort(sorters[sortSel.value]||sorters.newest);
+ grid.innerHTML=list.map(d=>{
+ const t=d.licenseTiers||[];
+ const line=t.map(x=>x.label.replace(' license','')+' '+usd0(x.priceUsd)).join(' · ');
+ return `<div class="lic-card">
+ <a href="${d.wpbUrl}" target="_blank" rel="noopener noreferrer"><img loading="lazy" src="${d.img}" alt="${d.title}"></a>
+ <div class="b">
+ <div class="t">${d.title}</div>
+ <div class="d">${d.styleLine}</div>
+ <div class="tiers-line">DRAFT · ${line}</div>
+ <div class="row">
+ <a href="${d.wpbUrl}" target="_blank" rel="noopener noreferrer">View on WPB →</a>
+ <a href="#lic-inquiry" data-lic-id="${d.id}" data-lic-title="${d.title}">Inquire</a>
+ </div>
+ </div>
+ </div>`;
+ }).join('');
+ grid.querySelectorAll('[data-lic-id]').forEach(a=>a.addEventListener('click',()=>{
+ picked={id:a.dataset.licId,title:a.dataset.licTitle};
+ $('lic-context').textContent='Re: '+picked.title+' (#'+picked.id+')';
+ }));
+ }
+ sortSel.addEventListener('change',render);
+ dens.addEventListener('input',render);
+ render();
+
+ $('lic-form').addEventListener('submit', async (e)=>{
+ e.preventDefault();
+ const email=$('lic-email').value.trim(), msg=$('lic-msg');
+ const tier=($('lic-tier').value+(picked?':'+picked.id:'')).slice(0,40);
+ msg.className='msg'; msg.textContent='…sending';
+ try{
+ const r = await fetch('/api/waitlist',{method:'POST',headers:{'Content-Type':'application/json'},
+ body:JSON.stringify({email, tier, source:'licensing'})});
+ const j = await r.json();
+ if(r.ok && j.ok){ msg.className='msg ok'; msg.textContent='Inquiry received — we’ll reach out with licensing details. 🎉'; $('lic-form').reset(); }
+ else { msg.className='msg err'; msg.textContent=j.error||'Could not send — try again.'; }
+ }catch(err){ msg.className='msg err'; msg.textContent='Network error — try again.'; }
+ });
+})();
+
// Waitlist capture → POST /api/waitlist
$('wl-form').addEventListener('submit', async (e)=>{
e.preventDefault();
diff --git a/server.js b/server.js
index 2170c87..9c2700c 100644
--- a/server.js
+++ b/server.js
@@ -3,7 +3,7 @@
*
* A single-page dashboard over Steve's real fleet (OpenClaw / @androoagi
* "agent environment" style), plus a self-funding P&L: it accounts for its own
- * token + energy COST and tracks REVENUE from four (gated) engines so it can
+ * token + energy COST and tracks REVENUE from five (gated) engines so it can
* pay for itself. "Claude needs to be paid for."
*
* Design: a 30s background buildSnapshot() gathers every (slow) source once and
@@ -700,7 +700,7 @@ function collectCost() {
return out;
}
-// --- REVENUE side of the P&L (four gated engines) --------------------------
+// --- REVENUE side of the P&L (five gated engines) --------------------------
function defaultRevenue() {
return {
updatedAt: new Date().toISOString(),
@@ -709,6 +709,7 @@ function defaultRevenue() {
{ key: 'affiliate', label: 'Affiliate / commission', status: 'gated', amount: 0, note: 'DW referral + directory lead-gen — awaiting affiliate signup + placement' },
{ key: 'billable_work', label: 'Agent does billable work', status: 'gated', amount: 0, note: 'arbitrage / paid reports / metered API — awaiting billing rail' },
{ key: 'ads', label: 'Ads on a public property', status: 'gated', amount: 0, note: 'ad network + public site — awaiting Steve go-live' },
+ { key: 'licensing', label: 'License WPB designs (B2B/marketplaces)', status: 'gated', amount: 0, note: 'catalog built — awaiting Steve channel signups' },
],
};
}
@@ -746,6 +747,10 @@ function collectRevenue() {
let base;
try { base = JSON.parse(fs.readFileSync(REVENUE_FILE, 'utf8')); }
catch (e) { base = defaultRevenue(); try { fs.writeFileSync(REVENUE_FILE, JSON.stringify(base, null, 2)); } catch (e2) {} }
+ // a revenue.json written before a new engine existed would otherwise hide it
+ for (const def of defaultRevenue().engines) {
+ if (!(base.engines || []).some((e) => e && e.key === def.key)) base.engines = [...(base.engines || []), def];
+ }
const led = readRevenueLedger();
// fold real income into each engine; an engine with income is de-facto "live"
base.engines = (base.engines || []).map((e) => ({ ...e, amount: round(led.byEngine[e.key] || 0, 2), status: (led.byEngine[e.key] || 0) > 0 ? 'live' : e.status }));
@@ -908,6 +913,9 @@ function isPublicLandingPath(req) {
// ads surface: the ads.txt stub (crawled by ad networks, must be public)
// and the ad-slot config (pub id only — pub ids ship in every ad snippet).
if (req.path === '/ads.txt' || req.path === '/api/ads/config') return true;
+ // licensing surface (engine 5): cached catalog of LIVE wallpapersback.com
+ // designs + DRAFT tier copy — no money mechanism, images stay WPB-hosted.
+ if (req.path === '/api/licensing/catalog') return true;
// affiliate surface: tracked redirects + the non-draft strip data (labels
// and slugs only — the registry's urls/notes stay behind auth).
return req.path.startsWith('/go/') || req.path === '/api/affiliates';
@@ -936,7 +944,7 @@ for (const key of ['system', 'localFleet', 'kamatera', 'canaries', 'crons', 'act
// above). This is the ONLY money-touching write — it just logs income that
// actually landed; it does NOT charge anyone. Turning an engine's *mechanism*
// on (Stripe, ads, affiliate) stays gated to Steve.
-const REVENUE_ENGINES = ['sell_product', 'affiliate', 'billable_work', 'ads'];
+const REVENUE_ENGINES = ['sell_product', 'affiliate', 'billable_work', 'ads', 'licensing'];
app.post('/api/revenue/record', async (req, res) => {
const b = req.body || {};
if (!REVENUE_ENGINES.includes(b.engine)) return res.status(400).json({ error: `engine must be one of ${REVENUE_ENGINES.join(', ')}` });
@@ -1308,6 +1316,18 @@ app.get('/api/ads/config', (req, res) => {
res.json({ enabled: !!AD_NETWORK_PUB_ID, pubId: AD_NETWORK_PUB_ID || null });
});
+// --- Licensing engine (engine 5): WPB design licensing catalog --------------
+// Read-only cache of designs that are LIVE on wallpapersback.com (already
+// settlement-passed + published; unpublished/user_removed are never eligible).
+// Pricing in the file is DRAFT copy only — no listing, sale, or outreach
+// happens here; external channel signups are Steve's gated switch (see
+// memos/licensing-channels.md). Refresh = re-run the read-only feed pull.
+const LICENSING_CATALOG_FILE = path.join(DATA_DIR, 'wpb-licensing-catalog.json');
+app.get('/api/licensing/catalog', (req, res) => {
+ try { res.json(JSON.parse(fs.readFileSync(LICENSING_CATALOG_FILE, 'utf8'))); }
+ catch (e) { res.json({ count: 0, designs: [], note: 'catalog not built yet' }); }
+});
+
// Waitlist email capture from the landing page → appends to data/waitlist.jsonl.
// This is NOT a money mechanism — it only collects interest; no Stripe, no
// charge, no send. One row per signup; basic email validation + dedupe-friendly.
← e664926 feat(ads): house-ad slot + ads.txt stub
·
back to AbramsEgo
·
style: apply design-research top items (androoagi/norma patt 63d3686 →