Concepts, value, and typical clone scenarios — less code.
Concepts, value, and typical clone scenarios — less code.
Preparing Ring content
Preparing Ring content
Preparing Ring content
The page curtain is a slim banner (about 10% of the screen height) that drops in after a visitor stops scrolling. It shows one of two kinds of offer: Add to Home Screen for the app, or a product a vendor has chosen to advertise. On news articles and member blog posts, a product added from the curtain can earn the page's author a commission when the shopper later pays.
Use the Founder / Developer tabs in the docs sidebar to filter this page. Shared sections apply to both audiences.
Status (2026-10-26): Shipped in Layer 1 and configurable per clone through the curtain block in ring-config.json. The queue now honors earlier dismissals, so a visitor who chose Not today does not see the same banner again on the next page.
| Without the curtain | With the curtain |
|---|---|
| Install prompts depend on the browser | Ring offers Add to Home Screen itself, once per policy window |
| Authors cannot earn from products they mention | Authors earn additive credit on paid carts that started from their page |
| Vendors pay for ads elsewhere | Vendors opt a product in and set a 1% to 10% author commission |
Writers bring readers; vendors want buyers. The curtain connects the two without a separate ad system. A vendor flags a product, a writer links it or writes about the same topic, and when a reader buys it, the writer is rewarded in platform credit. The vendor's payout is not reduced: the commission is minted as extra credit.
Article pages are where product offers appear.
Member posts get the same product offers and author commission.
Vendors switch on curtain advertising in the product form.
/my-news) shows the same 7 day funnel for their own pages plus curtain credits earned.Depends-on: products, cart and paid orders that trigger commission.
Same-workflow: article pages that host product offers.
Same-workflow: member posts host the same offers.
See-also: credit rewards that must be enabled for commission.
The page curtain is a slim banner (about 10% of the screen height) that drops in after a visitor stops scrolling. It shows one of two kinds of offer: Add to Home Screen for the app, or a product a vendor has chosen to advertise. On news articles and member blog posts, a product added from the curtain can earn the page's author a commission when the shopper later pays.
Use the Founder / Developer tabs in the docs sidebar to filter this page. Shared sections apply to both audiences.
Status (2026-10-26): Shipped in Layer 1 and configurable per clone through the curtain block in ring-config.json. The queue now honors earlier dismissals, so a visitor who chose Not today does not see the same banner again on the next page.
| Without the curtain | With the curtain |
|---|---|
| Install prompts depend on the browser | Ring offers Add to Home Screen itself, once per policy window |
| Authors cannot earn from products they mention | Authors earn additive credit on paid carts that started from their page |
| Vendors pay for ads elsewhere | Vendors opt a product in and set a 1% to 10% author commission |
Writers bring readers; vendors want buyers. The curtain connects the two without a separate ad system. A vendor flags a product, a writer links it or writes about the same topic, and when a reader buys it, the writer is rewarded in platform credit. The vendor's payout is not reduced: the commission is minted as extra credit.
Article pages are where product offers appear.
Member posts get the same product offers and author commission.
Vendors switch on curtain advertising in the product form.
/my-news) shows the same 7 day funnel for their own pages plus curtain credits earned.Depends-on: products, cart and paid orders that trigger commission.
Same-workflow: article pages that host product offers.
Same-workflow: member posts host the same offers.
See-also: credit rewards that must be enabled for commission.
The page curtain is a slim banner (about 10% of the screen height) that drops in after a visitor stops scrolling. It shows one of two kinds of offer: Add to Home Screen for the app, or a product a vendor has chosen to advertise. On news articles and member blog posts, a product added from the curtain can earn the page's author a commission when the shopper later pays.
Use the Founder / Developer tabs in the docs sidebar to filter this page. Shared sections apply to both audiences.
Status (2026-10-26): Shipped in Layer 1 and configurable per clone through the curtain block in ring-config.json. The queue now honors earlier dismissals, so a visitor who chose Not today does not see the same banner again on the next page.
| Without the curtain | With the curtain |
|---|---|
| Install prompts depend on the browser | Ring offers Add to Home Screen itself, once per policy window |
| Authors cannot earn from products they mention | Authors earn additive credit on paid carts that started from their page |
| Vendors pay for ads elsewhere | Vendors opt a product in and set a 1% to 10% author commission |
Writers bring readers; vendors want buyers. The curtain connects the two without a separate ad system. A vendor flags a product, a writer links it or writes about the same topic, and when a reader buys it, the writer is rewarded in platform credit. The vendor's payout is not reduced: the commission is minted as extra credit.
Article pages are where product offers appear.
Member posts get the same product offers and author commission.
Vendors switch on curtain advertising in the product form.
/my-news) shows the same 7 day funnel for their own pages plus curtain credits earned.Depends-on: products, cart and paid orders that trigger commission.
Same-workflow: article pages that host product offers.
Same-workflow: member posts host the same offers.
See-also: credit rewards that must be enabled for commission.
requestCurtainDropfeatures/curtain/actions.tsCURTAIN_QUEUE_MAX/admin, /login, /register, /auth, /vendor or /store/checkout.newsArticleId through CurtainPageProvider (news articles and member blog posts). The article must be published and visible to the viewer under canViewNewsArticle./store/<id> links found in the article body. Pool products are active products with curtainAdvertiseEnabled. Each must be advertised, active, priced, not the viewer's own vendor product, and not suppressed.curtain-host.tsx shows the queue and applies canShowOffer to every queued item, which is the fix for dismissed banners coming back.
| Response | Effect |
|---|---|
| CTA | Add to cart (product) or install prompt (A2HS) |
| Not today | Suppressed until notTodayHours from now |
| Not for me | Suppressed forever for that offer |
| Scroll away | Logged, no suppression |
Preferences live in localStorage (ring_curtain_prefs) and, for signed-in members, in the curtain_preferences table (migration 050, part of schema.sql) via syncCurtainPrefs.
offerToken from features/curtain/lib/offer-token.ts, signed with AUTH_SECRET. It binds offer, product, author and article.ring_curtain_attr cookie and storage (30 day window, at most 12 touches).verifyCurtainTouches. Author and percent come from the token and the live product, never from the browser.mintCurtainAuthorCommission in features/curtain/services/commission.ts adds credit to the author: line subtotal times the product's percent (1 to 10, default 5). It skips self-purchase, the order's referrer, duplicates, and runs only when credit rewards are enabled.curtain_shown, curtain_response, curtain_cta, curtain_suppress and curtain_paid feed getCurtainFunnel in features/analytics/lib/curtain-analytics.ts.The vendor product form includes AdvertiseProductWidget (features/curtain/components/advertise-product-widget.tsx). It writes curtainAdvertise: { enabled, commissionPercent } and curtainAdvertiseEnabled on the product. A product without a price cannot be advertised.
No. It is additive credit minted to the author, recorded with source curtain_author.
Not on a fresh install. Existing databases need 050_curtain_offers.sql for curtain_preferences and the analytics index.
Set "curtain": { "enabled": false } in that clone's ring-config.json and rebuild.
See-also: referral attribution, which shares the 30 day window.
requestCurtainDropfeatures/curtain/actions.tsCURTAIN_QUEUE_MAX/admin, /login, /register, /auth, /vendor or /store/checkout.newsArticleId through CurtainPageProvider (news articles and member blog posts). The article must be published and visible to the viewer under canViewNewsArticle./store/<id> links found in the article body. Pool products are active products with curtainAdvertiseEnabled. Each must be advertised, active, priced, not the viewer's own vendor product, and not suppressed.curtain-host.tsx shows the queue and applies canShowOffer to every queued item, which is the fix for dismissed banners coming back.
| Response | Effect |
|---|---|
| CTA | Add to cart (product) or install prompt (A2HS) |
| Not today | Suppressed until notTodayHours from now |
| Not for me | Suppressed forever for that offer |
| Scroll away | Logged, no suppression |
Preferences live in localStorage (ring_curtain_prefs) and, for signed-in members, in the curtain_preferences table (migration 050, part of schema.sql) via syncCurtainPrefs.
offerToken from features/curtain/lib/offer-token.ts, signed with AUTH_SECRET. It binds offer, product, author and article.ring_curtain_attr cookie and storage (30 day window, at most 12 touches).verifyCurtainTouches. Author and percent come from the token and the live product, never from the browser.mintCurtainAuthorCommission in features/curtain/services/commission.ts adds credit to the author: line subtotal times the product's percent (1 to 10, default 5). It skips self-purchase, the order's referrer, duplicates, and runs only when credit rewards are enabled.curtain_shown, curtain_response, curtain_cta, curtain_suppress and curtain_paid feed getCurtainFunnel in features/analytics/lib/curtain-analytics.ts.The vendor product form includes AdvertiseProductWidget (features/curtain/components/advertise-product-widget.tsx). It writes curtainAdvertise: { enabled, commissionPercent } and curtainAdvertiseEnabled on the product. A product without a price cannot be advertised.
No. It is additive credit minted to the author, recorded with source curtain_author.
Not on a fresh install. Existing databases need 050_curtain_offers.sql for curtain_preferences and the analytics index.
Set "curtain": { "enabled": false } in that clone's ring-config.json and rebuild.
See-also: referral attribution, which shares the 30 day window.
requestCurtainDropfeatures/curtain/actions.tsCURTAIN_QUEUE_MAX/admin, /login, /register, /auth, /vendor or /store/checkout.newsArticleId through CurtainPageProvider (news articles and member blog posts). The article must be published and visible to the viewer under canViewNewsArticle./store/<id> links found in the article body. Pool products are active products with curtainAdvertiseEnabled. Each must be advertised, active, priced, not the viewer's own vendor product, and not suppressed.curtain-host.tsx shows the queue and applies canShowOffer to every queued item, which is the fix for dismissed banners coming back.
| Response | Effect |
|---|---|
| CTA | Add to cart (product) or install prompt (A2HS) |
| Not today | Suppressed until notTodayHours from now |
| Not for me | Suppressed forever for that offer |
| Scroll away | Logged, no suppression |
Preferences live in localStorage (ring_curtain_prefs) and, for signed-in members, in the curtain_preferences table (migration 050, part of schema.sql) via syncCurtainPrefs.
offerToken from features/curtain/lib/offer-token.ts, signed with AUTH_SECRET. It binds offer, product, author and article.ring_curtain_attr cookie and storage (30 day window, at most 12 touches).verifyCurtainTouches. Author and percent come from the token and the live product, never from the browser.mintCurtainAuthorCommission in features/curtain/services/commission.ts adds credit to the author: line subtotal times the product's percent (1 to 10, default 5). It skips self-purchase, the order's referrer, duplicates, and runs only when credit rewards are enabled.curtain_shown, curtain_response, curtain_cta, curtain_suppress and curtain_paid feed getCurtainFunnel in features/analytics/lib/curtain-analytics.ts.The vendor product form includes AdvertiseProductWidget (features/curtain/components/advertise-product-widget.tsx). It writes curtainAdvertise: { enabled, commissionPercent } and curtainAdvertiseEnabled on the product. A product without a price cannot be advertised.
No. It is additive credit minted to the author, recorded with source curtain_author.
Not on a fresh install. Existing databases need 050_curtain_offers.sql for curtain_preferences and the analytics index.
Set "curtain": { "enabled": false } in that clone's ring-config.json and rebuild.
See-also: referral attribution, which shares the 30 day window.