Features

What's built, what it does, and where to find it in the codebase.

Deep dives on the bigger features live on their own pages — Customer Portal, Commerce, Media Gallery, and Visual Editors. Everything else is here.

Content & pages

Feature Route(s) Backend story
Block-driven pages /, /about, /features Local JSON ↔ Adhara-mergeable per block; edited via inline click-to-edit or the builder canvas — see The Content Model
Blog /blog, /blog/[slug] Reads always merge local ∪ Adhara; writes (npm run blog) switch via GRAVITY_BLOG_BACKEND
Events /events, /event/[slug], /portal/events Local ∪ Adhara merge once connected. The listing and every detail page are driven by the event’s own Adhara settings: pinned/featured order, hero image, schedule, hosts and speakers, ticket tiers, capacity. Sign-up follows the event’s registration mode and pricing — free/lead-capture registration, paid ticket checkout and donation checkout (Stripe, via Adhara’s public event-checkout endpoint; needs the workspace’s payment connection), a waitlist once full, and a link-out for listing-only events. /event/[slug] isn’t edge-cached (live capacity + post-checkout state)
Forms /forms Contact + multi-step wizard demos, proxied to a real Adhara form. Includes a honeypot anti-spam field (_hp — the real field name the Adhara backend itself expects)

Site features

Feature Route(s) Backend story
Scheduling & booking /scheduling, /schedule/[slug] No local content store — local is a clearly-labeled demo (sample meeting types, booking refused). Real availability/conflict checking only exists in Adhara
Links (link-in-bio) /links Whole-page swap, not a merge, once connected. Public read only — the authenticated write API exists on Adhara but has no in-app admin UI here yet
Podcast /podcast Not part of the toggle family — episode data always comes from parsing a real RSS/Atom feed via rss-parser, cached ~15 min. Feed URL: GRAVITY_PODCAST_RSS_URL, or an Adhara /links entry tagged category: "podcast"
Contact & newsletter /contact, footer signup Always saves locally first (data/content/contact-submissions/, data/content/contacts.json), then additively syncs to a real Adhara form / CRM lead once configured. Never gated on Adhara succeeding
Media gallery /gallery See Media Gallery

Platform

Feature Route(s) Notes
Admin dashboard /admin Live “Feature backends” panel for every toggle-family feature, editable-page shortcuts, dev/Adhara auth status
Customer portal /portal/* See Customer Portal
Shop / commerce /shop/* See Commerce
Visual editors Inline (floating button), builder canvas (/admin/editor/build/<page>) See Visual Editors

Authentication

Real Adhara-backed admin login isn’t implemented yet — the JS SDK’s documented surface has no confirmed user-auth (client.auth.login) resource for it. GRAVITY_DEV_ADMIN=1 is the supported local admin path until that endpoint is confirmed; never set it in production. The customer portal has its own separate GRAVITY_DEV_PORTAL=1 bypass — see Customer Portal.

Deploy targets & storage

Vercel, Cloudflare, Google Cloud Run, and Netlify, each deploying to a real platform-native runtime (a real Vercel Function, a real Cloudflare Worker — no Docker/proxy layer) — see Deploying. Content storage is pluggable across seven backends — see Storage.