INDULGON PLATFORM — MASTER BLUEPRINT
Generated: June 8, 2026
For: Cross-AI-Tool Synchronization
Purpose: Full architecture reference for all AI tools working on this platform
PLATFORM OVERVIEW
- Name: Indulgon (/in-DULGE-on/) — "Indulge On. Everyone."
- URL: https://indulgon.com
- Parent Company: JJ Entertainment, LLC
- Type: Universal creator management platform (adult entertainment + all industries)
- Stack: Node.js/Express backend, PostgreSQL database, HTML/CSS/JS frontend (no framework)
- Server: PM2 process manager, port 3000, Caddy reverse proxy on port 443
- VM: Azure (missjjent-5d61d440-5048-vm.azure.gensparkclaw.com)
OWNER
- Name: Jillian Janson (legal: Savana Dillard)
- User ID: 17beed97-9bc9-4bc9-91cc-6d8eede00390
- Role: admin + performer
- Platform login: https://indulgon.com/app/login.html
- Quick login: https://indulgon.com/app/login.html?quick=0217f746480c878c7b647148df324997baea42428a74d0e4b9726c4bb5eb5409
- Password: Indulgon2026!
CRITICAL RULES (must follow at all times)
1. NO emojis anywhere on platform UI (only in user-generated content like feed posts)
2. NO hardcoded hex color codes — use CSS variables only (var(--text), var(--bg), etc.)
3. ALL prices use CSS variables for display
4. "User Type" not "Role" or "Account Type" in all UI labels
5. Scene categories: "Mainstream Scenes" / "Self-Produced" / "Funded Scenes" / "All" — NEVER "Scene Work" as a tab
6. Fee Model D: customer pays product price + Stripe fee (2.9%+$0.30); performer pays only 15% platform fee
7. Test data before May 21, 2026 is flagged is_test_data=true — all real stats filter this out
8. Payout minimum: $20 — rolls over if below minimum. Biweekly (15th and last day of month)
9. No emojis in nav, tabs, buttons, labels, headings — users can add emojis to their own posts/captions only
WORKSPACE
- Code: /home/work/.openclaw/workspace/platform-server/
- Routes: /home/work/.openclaw/workspace/platform-server/routes/
- Frontend: /home/work/.openclaw/workspace/platform-server/public/app/
- Scripts: /home/work/.openclaw/workspace/platform-server/scripts/
- Git: commits tracked, always commit after changes
AUTHENTICATION
- JWT tokens stored in localStorage('token')
- Session also used server-side
- /api/auth/register — signup (POST, fields: email, password, username, display_name, role)
- /api/auth/login — login (POST, fields: email, password)
- /api/auth/me — check current user (GET, requires Authorization: Bearer )
- /api/auth/oauth — Google/Twitter OAuth (POST, fields: provider, access_token)
- /api/auth/logout — logout (POST)
- Google OAuth: client_id in .env as GOOGLE_CLIENT_ID
- Notion sync: every new signup calls syncCompleteUserData() → writes to Notion Users DB
DATABASE
- Type: PostgreSQL
- Tables: 450 total
- Connection: .env file has PG_HOST, PG_USER, PG_PASSWORD, PG_DATABASE, PG_PORT
- ORM: Raw SQL queries via pg Pool
- Key pattern: getDb(req) or app.locals.db — do NOT use direct pool imports in routes
KEY DATABASE TABLES (most important)
- users — all user accounts (performers, fans, agents, studios, admins)
- bookings — all bookings (mainstream scenes, appearances, etc.)
- booking_requests — pending booking requests
- transactions — all financial transactions (income + expenses)
- earnings — career earnings (imported + platform)
- messages + conversations — messaging system
- posts — feed posts
- subscriptions + subscription_tiers — subscription system
- products — store products
- tips — tip transactions
- notifications — user notifications
- model_releases — 2257 compliance releases
- age_verification + age_verifications — ID verification
- cam_rooms + cam_viewer_sessions — cam show system
- video_call_sessions — video calls (Daily.co integrated)
- fee_splits — performer-to-agent fee payments
- user_credits — fan credit balances
- payout_requests + payout_transfers + payout_periods — payout system
- client_errors — error tracking
- account_snapshots — account recovery snapshots
- scenes + films + film_performers — filmography/scene lifecycle
- safety_incidents + safety_alerts — safety system
API ROUTES (264 registered)
- /api/account → routes/account-management.js
- /api/account-types → routes/account-types.js
- /api/accounts → routes/multi-account.js
- /api/achievements → routes/achievements.js
- /api/activity → routes/activity-tracker.js
- /api/addresses → routes/addresses.js
- /api/admin → routes/admin-tools.js
- /api/affiliates → routes/affiliates.js
- /api/ai → routes/ai-assistant.js
- /api/ai → routes/ai-tools.js
- /api/ai-integrations → routes/ai-integrations.js
- /api/ai-tools → routes/ai-tools.js
- /api/album-auto → routes/album-auto.js
- /api/amateur → routes/amateur-content.js
- /api/amateur-content → routes/amateur-content.js
- /api/amazon-browser → routes/amazon-browser-scrape.js
- /api/amazon-scraper → routes/amazon-scraper-v2.js
- /api/amazon-wishlists → routes/amazon-wishlists.js
- /api/analytics → routes/analytics.js
- /api/analytics-advanced → routes/analytics-advanced.js
- /api/ar-filters → routes/ar-filters.js
- /api/archive → routes/archive.js
- /api/artist → routes/artist-portfolio.js
- /api/ask → routes/ask-box.js
- /api/auctions → routes/auctions.js
- /api/audio-rooms → routes/audio-rooms.js
- /api/auto-post-events → routes/auto-post-events.js
- /api/auto-upload → routes/auto-upload.js
- /api/automation → routes/automation.js
- /api/badges → routes/spending-badges.js
- /api/bank-import → routes/bank-import.js
- /api/bank-sync → routes/bank-alternatives.js
- /api/booking-system → routes/booking-requests.js
- /api/bookings → routes/bookings-full.js
- /api/bookings-workflow → routes/bookings-workflow.js
- /api/bookmark-tools → routes/bookmark-dedup.js
- /api/bookmarks → routes/bookmarks.js
- /api/bots → routes/bots.js
- /api/bundles → routes/bundles.js
- /api/calendar → routes/calendar-sync.js
- /api/calendar-privacy → routes/calendar-privacy.js
- /api/calendar-sync → routes/calendar-sync.js
- /api/cam → routes/cam-rooms.js
- /api/campaigns → routes/draft-campaigns.js
- /api/caption-library → routes/caption-library.js
- /api/captions → routes/caption-library.js
- /api/captions → routes/captions.js
- /api/cart → routes/cart.js
- /api/cashapp → routes/cashapp.js
- /api/categorization → routes/categorization.js
- /api/categorize → routes/categorization.js
- /api/channel-points → routes/channel-points.js
- /api/cloud → routes/cloud-files.js
- /api/command-center → routes/admin-command-center.js
- /api/comments → routes/comments.js
- /api/commerce → routes/commerce.js
- /api/communication → routes/communication.js
- /api/companion → routes/companion-services.js
- /api/connect → routes/partner-sdk.js
- /api/connectors → routes/connectors.js
- /api/contacts → routes/contact-import.js
- /api/contacts → routes/contact-sync.js
- /api/contacts → routes/industry-contacts.js
- /api/content-calendar → routes/content-calendar.js
- /api/content-gallery → routes/content-gallery.js
- /api/cosplay → routes/cosplay.js
- /api/counter-offers → routes/counter-offers.js
- /api/creators → routes/youtuber-asmr.js
- /api/credits → routes/credits.js
- /api/cross-connect → routes/cross-connections.js
- /api/cross-post → routes/cross-post.js
- /api/custom-requests → routes/custom-requests.js
- /api/customer → routes/customer-identity.js
- /api/dashboard-widgets → routes/dashboard-widgets.js
- /api/databases → routes/connected-databases.js
- /api/discounts → routes/holiday-discounts.js
- /api/discover → routes/discover.js
- /api/discovery-quiz → routes/discovery-quiz.js
- /api/dm → routes/messages.js
- /api/dmca → routes/dmca.js
- /api/draft-campaigns → routes/draft-campaigns.js
- /api/earnings → routes/earnings.js
- /api/earnings-widget → routes/earnings-widget.js
- /api/email-intel → routes/email-intelligence.js
- /api/email-sync → routes/email-sync.js
- /api/email-templates → routes/email-templates.js
- /api/email-test → routes/email-test.js
- /api/embed → routes/embed-widgets.js
- /api/embed-widgets → routes/embed-widgets.js
- /api/entities → routes/entity-links.js
- /api/entities → routes/transaction-entities.js
- /api/error-tracking → routes/error-tracking.js
- /api/event-scraper → routes/event-scraper.js
- /api/events → routes/event-scraper.js
- /api/expedite → routes/expedite.js
- /api/expenses → routes/expenses.js
- /api/experiences → routes/experiences.js
- /api/export → routes/data-export.js
- /api/export/bulk → routes/bulk-export.js
- /api/external-payments → routes/external-payments.js
- /api/extras → routes/platform-extras.js
- /api/fan-requests → routes/fan-requests.js
- /api/fan-tags → routes/fan-tags.js
- /api/fans → routes/fan-integration.js
- /api/fee-splits → routes/fee-splits.js
- /api/feed → routes/feed.js
- /api/files → routes/files.js
- /api/files/compare → routes/file-compare.js
- /api/filmography → routes/filmography.js
- /api/financial → routes/financial-hub.js
- /api/findom → routes/findom.js
- /api/fitness → routes/fitness.js
- /api/forms → routes/forms.js
- /api/friends → routes/friends.js
- /api/funded-scenes → routes/funded-scenes.js
- /api/fundraiser → routes/fundraiser.js
- /api/game → routes/indulgon-game.js
- /api/gamification → routes/gamification.js
- /api/gaming → routes/gaming.js
- /api/gaming-subs → routes/gaming-subs.js
- /api/gaps → routes/platform-gaps.js
- /api/gdpr → routes/gdpr.js
- /api/geo-block → routes/geo-blocking.js
- /api/geo-blocking → routes/geo-blocking.js
- /api/gif → routes/gif-editor.js
- /api/handles → routes/handle-resolver.js
- /api/health → routes/health-monitor.js
- /api/health-monitor → routes/health-monitor.js
- /api/house → routes/house-features.js
- /api/house-features → routes/house-features.js
- /api/iafd → routes/iafd-browser-scraper.js
- /api/import → routes/platform-import.js
- /api/inbox → routes/inbox.js
- /api/kanban → routes/kanban.js
- /api/layout → routes/layout-customizer.js
- /api/legal → routes/legal.js
- /api/life → routes/life-tracker.js
- /api/life-sync → routes/life-notion-sync.js
- /api/live-photos → routes/live-photos.js
- /api/live-queue → routes/live-queue.js
- /api/location → routes/location-proximity.js
- /api/loyalty → routes/loyalty-badges.js
- /api/mail → routes/mail.js
- /api/marketplace → routes/marketplace.js
- /api/matching → routes/matching.js
- /api/media → routes/media-assignments.js
- /api/media-search → routes/media-search.js
- /api/memories → routes/memories.js
- /api/messaging → routes/mass-messaging.js
- /api/model-releases → routes/model-releases.js
- /api/moderation → routes/content-moderation.js
- /api/music → routes/music.js
- /api/news → routes/news.js
- /api/notes → routes/notes.js
- /api/notification-prefs → routes/notification-prefs.js
- /api/notifications → routes/notifications.js
- /api/notifications → routes/unified-notifications.js
- /api/notion → routes/notion-live.js
- /api/notion/sync → routes/notion-sync-manager.js
- /api/onboarding → routes/onboarding-flows.js
- /api/onboarding-flows → routes/onboarding-flows.js
- /api/orders → routes/orders.js
- /api/pages → routes/custom-pages.js
- /api/payments → routes/payments.js
- /api/payouts → routes/payouts.js
- /api/performer → routes/performer-profile.js
- /api/performers → routes/performers.js
- /api/phone → routes/phone-notifications.js
- /api/photo-import → routes/photo-import.js
- /api/phrases → routes/custom-phrases.js
- /api/podcaster → routes/podcaster.js
- /api/politics → routes/politics.js
- /api/polls → routes/polls.js
- /api/portfolio → routes/portfolio.js
- /api/post-notify → routes/post-notifications.js
- /api/post-visibility → routes/post-visibility.js
- /api/ppv → routes/ppv.js
- /api/presence → routes/presence.js
- /api/presenter → routes/presenter.js
- /api/preservation → routes/content-preservation.js
- /api/press → routes/press-releases.js
- /api/pricing → routes/pricing.js
- /api/product-menu → routes/product-menu.js
- /api/products → routes/products.js
- /api/profile → routes/profile-discovery.js
- /api/profile-custom → routes/profile-custom.js
- /api/profile-pages → routes/profile-pages.js
- /api/profile-url → routes/user-subdomains.js
- /api/promo → routes/promo-codes.js
- /api/questions → routes/fan-questions.js
- /api/quotes → routes/quote-automation.js
- /api/raids → routes/raids.js
- /api/recipes → routes/recipes.js
- /api/recovery → routes/data-recovery.js
- /api/reels → routes/reels.js
- /api/referral → routes/referral.js
- /api/relationships → routes/relationships.js
- /api/reports → routes/reports.js
- /api/rider → routes/rider.js
- /api/rules → routes/platform-rules.js
- /api/safety → routes/safety.js
- /api/safety-security → routes/safety-security.js
- /api/safety-v2 → routes/safety-enhanced.js
- /api/scene-earnings → routes/scene-earnings.js
- /api/scene-promo → routes/scene-promo.js
- /api/scenes → routes/scene-cascade.js
- /api/search → routes/platform-search.js
- /api/service-menu → routes/service-menu.js
- /api/services → routes/services.js
- /api/settings → routes/settings.js
- /api/shortcuts → routes/shortcuts.js
- /api/smart-calendar → routes/smart-calendar.js
- /api/smart-post → routes/smart-post.js
- /api/smart-wishlists → routes/smart-wishlists.js
- /api/snapshots → routes/account-snapshots.js
- /api/social → routes/social.js
- /api/social-integration → routes/social-integration.js
- /api/social-mirror → routes/social-mirror.js
- /api/social-queue → routes/social-queue.js
- /api/sounds → routes/sounds.js
- /api/staging → routes/staging.js
- /api/storage → routes/storage.js
- /api/store → routes/store-v2.js
- /api/stories → routes/stories.js
- /api/studio → routes/studio-management.js
- /api/subscription-tiers → routes/subscription-tiers.js
- /api/subscriptions → routes/subscriptions.js
- /api/support → routes/support.js
- /api/support → routes/support-tickets.js
- /api/tags → routes/performer-tags.js
- /api/tags → routes/tags.js
- /api/tax → routes/tax-calculator.js
- /api/tax → routes/tax-reporting.js
- /api/teams → routes/teams.js
- /api/template-system → routes/template-system.js
- /api/templates → routes/templates-marketplace.js
- /api/test-mode → routes/test-mode.js
- /api/testing → routes/testing-service.js
- /api/tiers → routes/subscription-tiers.js
- /api/tip-menu → routes/tip-menu.js
- /api/trail → routes/change-trail.js
- /api/transaction-intel → routes/transaction-intelligence.js
- /api/transcripts → routes/transcripts.js
- /api/trash → routes/trash-bin.js
- /api/twitter → routes/twitter.js
- /api/unfulfilled → routes/unfulfilled-requests.js
- /api/updates → routes/updates.js
- /api/used-items → routes/used-items.js
- /api/user-data → routes/user-data.js
- /api/user-types → routes/user-types.js
- /api/v2 → routes/db-api.js
- /api/vault → routes/vault.js
- /api/venues → routes/house-features.js
- /api/verification → routes/verification-passport.js
- /api/video-calls → routes/video-calls.js
- /api/video-editor → routes/video-editor.js
- /api/vip-events → routes/vip-events.js
- /api/visual-search → routes/visual-search.js
- /api/watchlist → routes/watchlist.js
- /api/watermark → routes/watermark.js
- /api/wishlist-sync → routes/wishlist-sync.js
- /api/wishlists → routes/wishlists.js
- /api/writer → routes/writer.js
- /api/youtuber-asmr → routes/youtuber-asmr.js
FRONTEND PAGES (132 total)
- /app/achievements.html
- /app/activity.html
- /app/address-book.html
- /app/admin-login.html
- /app/admin-user-detail.html
- /app/admin-users-directory.html
- /app/admin-users.html
- /app/admin.html
- /app/ai-assistant.html
- /app/ai-guide.html
- /app/analytics-dashboard.html
- /app/analytics.html
- /app/archive.html
- /app/artist.html
- /app/ask-box.html
- /app/asmr.html
- /app/auction-system.html
- /app/automation-workflows.html
- /app/bookings.html
- /app/bookmarks.html
- /app/bots.html
- /app/cam.html
- /app/cart.html
- /app/checkout.html
- /app/command-center.html
- /app/communication-center.html
- /app/community.html
- /app/companion-services.html
- /app/connections.html
- /app/content-calendar-advanced.html
- /app/content-calendar.html
- /app/content-gallery.html
- /app/cosplayer.html
- /app/cost-comparison.html
- /app/dashboard.html
- /app/discover-quiz.html
- /app/discover.html
- /app/earnings-v2.html
- /app/earnings.html
- /app/expenses-v2.html
- /app/expenses.html
- /app/faq.html
- /app/feed.html
- /app/files.html
- /app/filmography.html
- /app/financial.html
- /app/findom.html
- /app/fitness.html
- /app/fundraiser.html
- /app/gamification-hub.html
- /app/gaming.html
- /app/getting-started.html
- /app/glossary.html
- /app/house-girl.html
- /app/import.html
- /app/inbox.html
- /app/indulgon-app.html
- /app/indulgon-game.html
- /app/kanban.html
- /app/legal.html
- /app/life.html
- /app/live-hub.html
- /app/live-queue.html
- /app/login.html
- /app/management-guide.html
- /app/marketplace.html
- /app/messages-v2.html
- /app/messages.html
- /app/mockup-dashboard.html
- /app/music.html
- /app/musicians.html
- /app/news.html
- /app/notes.html
- /app/notifications.html
- /app/oauth-callback.html
- /app/onboarding.html
- /app/order.html
- /app/page-builder.html
- /app/partners.html
- /app/payments.html
- /app/performer.html
- /app/podcaster.html
- /app/politics.html
- /app/portfolio.html
- /app/pricing.html
- /app/products.html
- /app/profile-customizer.html
- /app/profile.html
- /app/publications.html
- /app/publicist.html
- /app/recipes.html
- /app/reels.html
- /app/reports.html
- /app/request-form-editor.html
- /app/request-inbox.html
- /app/rider.html
- /app/safety-center.html
- /app/safety.html
- /app/scene-earnings-dashboard.html
- /app/scene-work.html
- /app/sdk-docs.html
- /app/services.html
- /app/settings.html
- /app/setup-guide.html
- /app/shifts.html
- /app/signup-fan.html
- /app/signup-performer.html
- /app/smart-post.html
- /app/social-integrations.html
- /app/social.html
- /app/spaces.html
- /app/store-v2.html
- /app/store.html
- /app/stories.html
- /app/subscriptions-manager.html
- /app/support-center.html
- /app/support.html
- /app/tax.html
- /app/templates-manager.html
- /app/templates.html
- /app/tos.html
- /app/tour.html
- /app/transcripts.html
- /app/tutorial.html
- /app/updates.html
- /app/used-items.html
- /app/vault.html
- /app/video-calls.html
- /app/video-editor.html
- /app/watchlist.html
- /app/wishlists.html
- /app/writer.html
INTEGRATIONS
- Stripe: STRIPE_SECRET_KEY in .env | Connect account: acct_1TalIsQU9ri4CGiR (Jillian's performer account — VERIFIED as of June 8, 2026)
- Notion: NOTION_INTERNAL_TOKEN in .env | 12+ databases synced
- Daily.co: DAILY_API_KEY in .env | Video calls (rooms created per session, owner/participant tokens)
- Google OAuth: GOOGLE_CLIENT_ID + GOOGLE_CLIENT_SECRET in .env
- Twilio: TWILIO_ACCOUNT_SID + TWILIO_PHONE_NUMBER in .env | SMS notifications
- SendGrid/Nodemailer: Email via SMTP in .env
NOTION DATABASES
- Users: 263b8641-18fc-8077-8823-e7b4a8354c78
- Error Tracking: 36ab8641-18fc-81a6-...
- Safety Alerts: 36bb8641-18fc-81cf-...
- Business Alerts: 36bb8641-18fc-818b-...
- Bookings & Requests: 36bb8641-18fc-8155-...
- Earnings & Payments: 36bb8641-18fc-819f-...
- Notifications: 36bb8641-18fc-8182-...
- Support & Reports: 36bb8641-18fc-8110-...
- Legal & Compliance: 36bb8641-18fc-8170-...
- Content & Posts: 36bb8641-18fc-819d-...
- Payout History: 36bb8641-18fc-8124-...
- Platform Stats: 36bb8641-18fc-81f9-...
- Notion Command Center: https://www.notion.so/Indulgon-Notion-Command-Center-36bb864118fc81fd9fd7eca3e34e39ae
PRICING / FEE MODEL
- Platform fee: 15% on all transactions
- Fee Model D: Customer pays (product price + Stripe processing fee), Performer pays 15% platform fee
- Stripe processing: 2.9% + $0.30 (paid by customer on top of product price)
- Performer receives: 85% of product price
- Pay-per-message (PPM): Fans pay per message (default: $2 text / $5 photo / $10 video)
- Video call: $20/min | Voice call: $5/min | Cam show: $20/min
ONLINE/STATUS SYSTEM
- users.online_mode: 'visible' | 'incognito' | 'appear_offline'
- users.industry_status: 'active' | 'on_hiatus' | 'inactive' | 'retired'
- users.last_seen: updated every 60s via heartbeat
- Heartbeat: POST /api/settings/heartbeat
- Offline: POST /api/settings/offline (sendBeacon on tab close/app switch)
- Nav status picker on every page (bidirectional with Settings)
SCENE WORK SYSTEM
- production_type column on: scenes, bookings, films, transactions
- Values: 'mainstream' | 'self_produced' | 'funded'
- Mainstream = studio/company booked performer
- Self-produced = performer funded themselves
- Funded = third party paid (fan, another creator for their OF/site, brand)
- Confirm payment → auto-creates scene record + earnings entry + costar detection
IMPORTANT FILES
- server.js — main Express app entry point
- routes/_register.js — all route registrations
- db/client.js — database connection
- db/comprehensive-sync.js — Notion sync for users
- db/alert-sync.js — Notion sync for alerts
- scripts/ — cron scripts (morning-summary, error-notify, sync-health-check, etc.)
- public/app/js/nav.js — global navigation (injected on all pages)
- public/app/js/online-status.js — online status system (on all pages)
- public/app/css/platform.css — main CSS with all CSS variables
- public/app/css/themes.css — theme system
CRON JOBS (current schedule)
- PM2 crash monitor: every 30 minutes
- Error check: every 6 hours
- Sync health check: every 12 hours
- Morning summary: 8am daily (Notion page + email to [email protected])
- Daily error digest: 9am daily
- Daily ID expiry check: 9am daily
EMAIL ROUTING (all → [email protected] via Cloudflare catch-all)