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.