Post Studio — Compose & Publish Client Posts
Post Studio is the app customer-care reps use to compose and actually publish social/GBP posts on behalf of FCR subscribers — to Google Business Profile, Facebook, Instagram, LinkedIn and the website widget, via the subscriber’s Yext account. First real GBP post published through it 2026-05-31.
- Front-end: React/TS app at
post-studio.pages.dev(repoFCR4IE/post-studio, branchproduction— not GitHub-connected; updates only via manualwrangler pages deploy). - Backend: the
post-studio-*handlers in this repo’sfcr-dashboard-apiworker. - Entry: the AI advisor’s “post-studio” door mints a signed JWT deep-link. The JWT is the credential — the worker verifies the HS256 signature (
STUDIO_JWT_SECRET) on every call.
The flow
Section titled “The flow”- Find the listing —
post-studio-searchsearches the subscriber’s Yext entities. - Load the client’s real facts —
dashboard-post-studio-brand(per-subscriber brand config),-gbp-photos(GBP owner photos via Pleper),-products(Merchant Centre product feed). - Draft —
post-studio-draftruns one canonical system prompt (single source of truth across all reps; the rep’scustom_guardrailsare appended per request). When agrounding_urlis supplied the worker crawls it server-side and feeds the real page content to the model alongside the structured business/product fields — the “never invent” invariant only works if the model is actually given the facts. Crawl failure is non-fatal. - Suggest / illustrate —
post-studio-post-suggestand-image-suggestoffer options;post-studio-image-generatecreates an image via the Creator/Modal pipeline. - Publish —
post-studio-publish.
Publish mechanics (Yext)
Section titled “Publish mechanics (Yext)”- Yext Management API v2:
POST /v2/accounts/{subscriberId}/posts— the Yext account id is the FCR subscriberId (accounts/mereturns empty; proven on the read path). - Auth is an independent app key (
YEXT_POSTS_API_KEY, the second of the two Yext keys — Studio-isolated so it can be rotated without touching listings sync). - Yext takes one publisher per Post:Create, so multi-platform selections fan out one request per publisher with per-platform results reported back.
topicType/ CTA fields are GBP-only;photoUrlsaccept any public URL (Yext re-hosts the image).- Safety valves:
dry_run:truebuilds the exact payloads without sending; with no key set the handler returnsstatus:"spoofed"instead of hitting Yext. Every call (spoof, dry-run, live) writes an audit row to KV (post-studio-publish:<job_id>, 30-day TTL) carrying the live Yext postIds. - Status: GBP publishing is proven live; Facebook/Instagram/LinkedIn are wired but untested.
Chat → Studio image handoff
Section titled “Chat → Studio image handoff”post-studio-handoff-create / -poll / -complete persist images dropped into an advisor chat to R2 with a JWT, so the Studio surfaces can pick them up. The same handoff serves Creator Studio (the advisor’s image create/edit brain, separate static front-end at creator-studio-738.pages.dev, repo FCR4IE/creator-studio) — the advisor is the router; Creator is the image brain; Post Studio is the publisher.
Ownership & handover
Section titled “Ownership & handover”Both Studio surfaces are backed by this repo’s worker; only YEXT_POSTS_API_KEY + STUDIO_JWT_SECRET are Studio-isolated/rotatable, and Pleper is shared with the wider platform (the gbp-photos picker). Full developer handover including every credential: STUDIO_AND_POST_STUDIO_HANDOVER_2026-06-08.md (repo root).