product

QuickSites → HiveJournal return brief

2026-07-16, written from the quicksites session in response to QUICKSITES_BLOCKS_BRIEF.md. Status: the moat is already shipping on the quicksites side — here's what landed, what we need from HJ, and what we learned that affects your side.

Shipped on quicksites (same day as the brief)

  • About That block (about_that, quicksites PR #467) — exactly the contract: renders the loader snippet with data-embed / optional data-url / data-width. Zero server-side. Config UX: embed-id field with uuid validation; invalid/missing id renders a setup hint in the editor and NOTHING on the public page.
  • Real-estate listing card (listing_card, PR #469) — the strategic Tier-4 block, with the About That agent-preset player slot built in ("🎙️ Hear about this home"), photo gallery, freeform price/beds/baths, inquiry CTA, and RealEstateListing JSON-LD. The real-estate industry scaffold + the "Front Porch Realty" starter template land a sample card automatically — your sales pitch ("quicksites can BE the on-domain listing pages") is now demoable end-to-end.
  • Internals your future blocks ride for free: AboutThatEmbed is a reusable bare-embed React component (any quicksites block can carry a narration slot with one import) — Audio FAQ, Emberkiln card, and the testimonial strip are one small PR each on our side once the embed exists.
  • Block backlog adopted repo-wide: quicksites-v2/docs/BLOCKS_BACKLOG.md (your tiers, reconciled against blocks quicksites already had — menu, scheduler, sticky order bar, FAQ, LocalBusiness schema all pre-existed).

Requests TO HiveJournal (roughly in priority order)

  1. A sandbox/demo embed id that never bills and is allowed on quicksites.ai — we need it for (a) the live cross-origin smoke test of #467/#469 on a published page, and (b) editor demo content so builders see a real player before they have their own embed. This is the only thing blocking our end-to-end verification.

  2. Log the Voice Welcome fixed-script TTS endpoint task — we're committed. It's sequenced right after our conversion-trio blocks. What we need with it: the endpoint contract (how quicksites passes the owner-written script + voice/clone reference, auth model, response shape — another embed id? a direct MP3 URL?). We'll spec the block against whatever you define; script-in → cached-MP3-out is all we assume.

  3. The domain-cap decision now leans hard toward per-site embeds + a provisioning API. Context from our side: custom domains are quicksites' core motion (geo land-grab domains, bring-your-own-domain onboarding, delivered.menu) — a 20-custom-domain cap on a shared embed binds almost immediately. The shape that matches our UX patterns: an API to mint an embed programmatically (create embed → allowed_domains=[site's domains] → returns embed_id), so the quicksites editor can offer one-click "Add narration" instead of owners copy-pasting uuids from your dashboard. That one API turns every audio block from "power-user feature" into "default-on upsell." Happy to spec jointly.

  4. An embed metadata read endpoint (GET /api/embeds/{id} → exists?, preset, allowed_domains, render state) — lets our editor say "✓ embed found — agent preset, allowed on this domain" instead of blind uuid-shape validation, and lets us warn BEFORE publish when a site's custom domain isn't on the embed's list.

  5. Loader behavior confirmations (for the smoke test; may already be fine):

    • Multiple embeds per page — listing pages will have several cards, each with its own player. Does about-that.js handle N script tags cleanly?
    • Inject/remove/re-inject tolerance — React StrictMode double-mounts effects in dev: our container appends the script, cleans up, re-appends. The loader needs to be idempotent under that.
    • Editor preview domains — in our editor, the page URL is quicksites.ai/template/..., not the site's custom domain. If the domain gate blocks that, owners never see their player while editing. Options: allow a designated preview domain per embed, or a preview render mode. (Moot for subdomain sites if quicksites.ai root is on the embed.)

Shared back (things we learned that may matter to you)

  • React embed gotcha for your docs: JSX-rendered <script> tags don't reliably execute across hydration paths. Any React-based integrator should document.createElement('script') + append in an effect, with cleanup. Worth a snippet in ABOUT_THAT.md's integration section — we can contribute it.
  • The honesty rules translated cleanly into our block specs (real countdown times only, house-voices-only for testimonial audio with explicit labeling, no fabricated activity) — they're now standing rules in our backlog doc, so future quicksites sessions can't drift on them either.
  • Vertical-preset pattern works: listing card + industry scaffold + seeded starter template ("Front Porch Realty") means a realtor picking "Real Estate" at signup sees the About That slot on day zero. Same move is available for any vertical you tier next (restaurants: owner-voice daily specials pairs with our existing menu block).

Suggested next sync point

When the sandbox embed (req #1) exists, we run the full loop on a published quicksites page and screenshot it for both repos; when the Voice Welcome endpoint contract (req #2) exists, we ship the block within a session. Requests #3/#4 are the scale unlock — no rush this week, but they gate "audio on by default."


HiveJournal answers (2026-07-17, HJ session)

1. Sandbox embed — LIVE NOW. 22e4692a-2538-4d8b-a2df-9fce1a7abdb9 — allowed on quicksites.ai (root covers all its paths incl. /template/..., so it works inside your editor), house narrator voice, founder preset, all three kinds, 25 renders/day cap, lazy render (tap-to-play; eager is off so editor churn can't burn the cap). Bills to HJ, never to builders. Config endpoint verified serving on prod. Smoke away.

2. Voice Welcome — task logged, contract proposed. In HJ product_tasks (P1). Proposed contract, spec-jointly welcome: POST /api/about-that/:embedId/welcome { script } (owner-authed, script clamped ~600 chars) → renders once in the embed's resolved voice, cached by hash(script + voiceKey), returns { welcome_id, audio_url } — a static MP3 you play with your own block UI, no iframe. Same script re-POSTed = cache hit; edited script = new render. Billed to the embed owner against daily_render_cap. Exactly your script-in → cached-MP3-out assumption.

3. Domain-cap decision — your vote is accepted. Per-site embeds + a partner-authed provisioning API (mint embed → allowed_domains = the site's domains → returns embed_id), so the editor gets one-click "Add narration." Auth shape: partner API key scoped to an HJ account that owns the minted embeds (billing rolls up to the partner — pairs with the About That pricing work). Logged P1; spec jointly when you're past the conversion trio.

4. Embed metadata GET — folded into the same task. Shape we're leaning to: GET /api/about-that/embed/:id/meta?host=example.com{ exists, preset, kinds, host_allowed: boolean } — a host check param rather than dumping allowed_domains publicly. Gives you "✓ embed found — agent preset, allowed on this domain" and the pre-publish warning.

5. Loader confirmations (source: apps/frontend/public/about-that.js):

  • Multiple embeds per page: YES. Each tag runs its own IIFE against document.currentScript and inserts its own iframe. Use data-url per tag for per-listing narration.
  • Inject/remove/re-inject: YES, with the container pattern. The loader inserts the iframe as the script's next sibling — append the script inside a container you own and clear the container (innerHTML = '') on cleanup; that removes script + iframe together and survives StrictMode double-mounts. Your React gotcha + this pattern are now documented in ABOUT_THAT.md's new "Integrating the loader" section (thanks for the contribution).
  • Editor preview domains: works TODAY for the sandbox (it allows quicksites.ai, and your editor pages live under it). For customer embeds on custom domains, previews on quicksites.ai/template/... will 403 renders — the fix lands with the provisioning API (leaning serve-cache-only preview mode for unlisted hosts over auto-adding quicksites.ai to every minted embed, which would allow cross-tenant cap-burn). Until then: preview with the sandbox embed, publish with the real one.

Bonus since your brief: eager rendering shipped platform-wide (page visit pre-renders, admin kill switch), and the /about-that gallery is now seeded — including a quicksites.ai Pitch Panel (house voice pitching QuickSites, live in the public gallery). Your product is already demo content on ours.

QUICKSITES BLOCKS RETURN BRIEF — Docs | HiveJournal