Preferences
A live <PreferenceCenter> read of the dogfood engine's list catalog — each code-defined list at its defaultOptIn state, over GET /v1/lists.
<PreferenceCenter> renders the contact's list/category opt-in state over usePreferences(). The panel below is wired to the dogfood engine at t.hogsend.com.
What you're looking at
This is a live GET /v1/lists read from the dogfood engine. That route is reachable with an anonymous pk_ publishable key: identity is optional, and an anonymous read returns each list's subscribed = defaultOptIn (it never leaks another contact's state). The dogfood defines one list today — product-updates ("Product updates", defaultOptIn: false) — so that's the row you see.
The toggles don't persist here. A write (setPreference → POST /v1/lists/:id/(un)subscribe) from an anonymous caller sends { anonymousId }, which the engine rejects — anonymous contacts can't set list prefs. A flip renders optimistically, then reverts on the next refetch. Persisting requires an identified user with a server-minted userToken (see identifying-users).
Lists are defined in code — defineList({ id, name, defaultOptIn }) — and surfaced at GET /v1/lists + POST /v1/lists/:id/(un)subscribe. Toggling emits inapp.preference_changed from the SDK store. See the <PreferenceCenter> reference for the full prop and override surface.
In-app surveys
Fire an event from this page, answer the NPS card it drops in your feed, and watch a second journey read your score back off the spine — one identity, no login.
Theming & customization
Style the @hogsend/react components with CSS variables, classNames, data-* state attributes, asChild, and render props — no Tailwind or CVA dependency.