feat: anonymous guest mode — grocery list without account (affiliate revenue) #72

Closed
opened 2026-04-08 22:47:53 -07:00 by pyr0ball · 1 comment
Owner

Summary

Allow unauthenticated visitors to build a grocery list on the cloud instance without creating an account. Monetized via affiliate links. Serves as an acquisition funnel into free account signup.

Design spec

circuitforge-plans/kiwi/superpowers/specs/2026-04-15-anonymous-grocery-list-design.md

Key decisions

  • is_guest: bool on CloudUser (not a fake tier value)
  • circuitforge_core.guest module extracted simultaneously (Snipe is the second consumer)
  • Per-UUID ephemeral SQLite DB under CLOUD_DATA_ROOT/guest/{uuid}/
  • 24h TTL enforced by hourly cleanup task
  • Three entry points: Build Your Own (primary), recipe search, browse
  • Affiliate disclosure with honest third-party data callout + thank-you on opt-in
  • Genuine opt-out to plain links
  • Upsell: passive banner + save prompt on permanence actions only (no modals, no countdown)
  • Guest list migrates to account on signup
  • Snipe session model correction included in rollout

Tracks

  • Also resolves #71 guest layer (Shopping tab authenticated grocery list remains a separate feature)

Closing: Guest session path implemented in app/cloud_session.py_resolve_guest_session(), _anon_guest_db_path(), kiwi_guest_id cookie, anon-{uuid} user_id prefix, per-session SQLite isolation all present.

## Summary Allow unauthenticated visitors to build a grocery list on the cloud instance without creating an account. Monetized via affiliate links. Serves as an acquisition funnel into free account signup. ## Design spec `circuitforge-plans/kiwi/superpowers/specs/2026-04-15-anonymous-grocery-list-design.md` ## Key decisions - `is_guest: bool` on `CloudUser` (not a fake tier value) - `circuitforge_core.guest` module extracted simultaneously (Snipe is the second consumer) - Per-UUID ephemeral SQLite DB under `CLOUD_DATA_ROOT/guest/{uuid}/` - 24h TTL enforced by hourly cleanup task - Three entry points: Build Your Own (primary), recipe search, browse - Affiliate disclosure with honest third-party data callout + thank-you on opt-in - Genuine opt-out to plain links - Upsell: passive banner + save prompt on permanence actions only (no modals, no countdown) - Guest list migrates to account on signup - Snipe session model correction included in rollout ## Tracks - Also resolves #71 guest layer (Shopping tab authenticated grocery list remains a separate feature) --- **Closing:** Guest session path implemented in `app/cloud_session.py` — `_resolve_guest_session()`, `_anon_guest_db_path()`, `kiwi_guest_id` cookie, `anon-{uuid}` user_id prefix, per-session SQLite isolation all present.
pyr0ball changed title from feature: guest/demo mode — unauthenticated access with transient session to feat: anonymous guest mode — grocery list without account (affiliate revenue) 2026-04-15 08:59:07 -07:00
pyr0ball added this to the Beta — Shopping & Affiliates milestone 2026-04-18 09:02:47 -07:00
Author
Owner

Partial complete (2026-04-18): Per-session guest DB isolation is now live in cloud.

  • Anonymous visitors get a kiwi_guest_id UUID cookie (90-day, HttpOnly, Secure)
  • Each visitor gets an isolated SQLite DB at CLOUD_DATA_ROOT/anon-{uuid}/kiwi.db
  • No shared state between visitors — shopping lists/affiliate interactions are fully isolated
  • Fixed a related bug where Docker bridge subnet in CLOUD_AUTH_BYPASS_IPS was routing all cloud requests to the local-dev DB

Remaining work: Shopping list UI as first-class object (tracked in #71) — grocery list tab, add-to-list from recipes/inventory, affiliate link surfacing.

**Partial complete (2026-04-18):** Per-session guest DB isolation is now live in cloud. - Anonymous visitors get a `kiwi_guest_id` UUID cookie (90-day, HttpOnly, Secure) - Each visitor gets an isolated SQLite DB at `CLOUD_DATA_ROOT/anon-{uuid}/kiwi.db` - No shared state between visitors — shopping lists/affiliate interactions are fully isolated - Fixed a related bug where Docker bridge subnet in `CLOUD_AUTH_BYPASS_IPS` was routing all cloud requests to the `local-dev` DB **Remaining work:** Shopping list UI as first-class object (tracked in #71) — grocery list tab, add-to-list from recipes/inventory, affiliate link surfacing.
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Circuit-Forge/kiwi#72
No description provided.