Summary
Social is moving to an in-house tool and off Predis. Predis was not producing favorable responses, and the voice guiding docs already live in this vault, so the cleaner path is to draft on-voice from those docs, surface drafts for Kevin to review and approve, and publish approved posts directly through the social platform APIs (access is in hand). Nothing posts without Kevin's approval.
Most of this already exists in kindredros-social: on-voice generation (lib/generate.ts reads the voice docs), a drafts and review surface, and an app/api/publish route that direct-posts to LinkedIn and Meta. That direct-publish route predated Predis and was being retired; the pivot keeps it and builds on it. The half-built Predis integration (SOC-2 through SOC-5, uncommitted in the working tree) is shelved, not shipped, and the two Predis build handoffs in Ben's inbox are marked superseded.
This reverses the Predis plan Kevin confirmed on 2026-05-27, so it needs a quick confirm from him (good Friday-call item). The build itself is Ben's ops call and can proceed. Full task list in social-tasks.md.
Open
- The tool is now a full web-native Studio at
/studio(live, v26), decoupled from the vault: posts are authored on the website — create-from-scratch or via AI Mode bulk import — images auto-generate, Kevin approves, and publishing goes to Facebook / Instagram / LinkedIn Page / LinkedIn Kevin. The old/reviewURL redirects to/studio. SOC-10 / SOC-14 deploy gate is closed: image gen is live with funded OpenAI + xAI keys; Kevin's LinkedIn personal publish is verified working end-to-end. - Platforms connected: Instagram, Facebook, and LinkedIn (Kevin personal) post live. LinkedIn Page (org) posting is wired to the correct org URN but waits on LinkedIn's Community Management API approval. Posting still only fires on Kevin's approve.
- Confirm the move off Predis with Kevin (reverses his 2026-05-27 confirmation).
- Keep the human approval gate: nothing posts unreviewed.
- Hygiene: scrub and rotate the exposed Predis key from git history even though Predis is retired.
Updates
- 2026-06-06: Status sweep. The in-house social tool shipped on 2026-06-05 (commit c06ddb3, deployed; live at /review and /inbox per Ben note
2026-06-05 2330 SHIPPED). SOC-9, SOC-11, SOC-12 marked done in social-tasks.md. SOC-10 (Ben, Fly env vars plus the one-time LinkedIn OAuth token) stays open for v1 acceptance. Predis cleanup landed in the same commit. Kevin's confirm of the move off Predis and his approve-to-post gate still stand. - 2026-06-09: Image generation + publishing landed (SOC-14, built and pushed; not yet deployed). The Asset Studio engine was ported from seen-ops and wired end to end across three commits:
e839944(generated images as a third source alongside Unsplash and manual),33a6427(publish to LinkedIn and Facebook),b45d074(publish to Instagram via a signed, short-lived public JPEG route, closing the IG public-URL + JPEG gap). Unsplash stays as a parallel option; Kevin's approve gate is unchanged. Remaining is Ben's deploy-gate work: set OPENAI_API_KEY + XAI_API_KEY (optionally PUBLIC_BASE_URL / ASSET_URL_SECRET) and deploy; the first deploy confirms sharp loads in the Alpine container (fallback noted in the commit). Also today: APP-4 donor list view shipped to the app's master (aeb48aa), separate repo. - 2026-06-15: Content is ready for Kevin and Kevin is back. The staged week-1 LinkedIn drafts (SOC-7) got their honest voice-review pass (Ben note
2026-06-15 1210): re-graded down from an inflated 8.6 average to about 6.9 and each rewritten in place, withoriginalCaptionpreserved for revert. One integrity flag carried forward: a JC-invented lost-supporter anecdote was caught in Kevin's first-person voice on the Wednesday founder post, removed, and reverted to his original; that post needs Kevin's personal sign-off and any true story must come from him. All five scan clean (no em dashes, no double hyphens, no banned words, fundraiser audience held). With Kevin back, the move-off-Predis confirm (his 2026-05-27 reversal) is now a live ask, not a parked one; his approve-to-post gate is unchanged. Build and deploy posture unchanged: still Ben's deploy gate (SOC-10 env and tokens). - 2026-06-15 (Studio build + deploy session): The social tool became a full web-native Studio and shipped live to
kindred-ros-ops(through v26). Renamed/review->/studio(old URL redirects). Architecture change at JC's direction: the Studio is decoupled from the Obsidian vault — the vault is internal-only (project/Nicolai brain), and external posts now live in a web-origin store on the Fly volume (lib/webDrafts.ts), so posts are authored start-to-finish on the website with no Obsidian dependency. Shipped this session: (1) web-native drafts — create-from-scratch, caption write or AI "Generate copy" (nowclaude-sonnet-4-6, structured caption + hashtags + CTA), image gen, approve, publish, delete, all via a unifiedresolveDraft; (2) four publishing channels — Facebook, Instagram, LinkedIn Page (urn:li:organization:118344127), LinkedIn Kevin (urn:li:person:NqrQ33Ix5n) — with per-channel tokens; (3) image generation deployed with funded keys — XAI_API_KEY (Grok) and a funded OpenAI service-account key (gpt-image-1-mini), both verified generating in prod, closing the SOC-14 deploy gate; (4) LinkedIn OAuth auto-refresh (lib/linkedinAuth.ts+/api/auth/linkedin/start|callback+ a Connect-LinkedIn button) so Kevin's 60-day token refreshes hands-off once he Connects (needs the redirect URI registered in app 86qxabb2jnv4co); (5) Tigris object storage (bucketkindredros-studio-media) for uploaded media, an upload panel, img2img references (OpenAI/xAI edit), and a suppress-text toggle — also fixed an aws-sdk-v3 checksum default that was breaking S3-compatible presigned URLs; (6) a stamp editor — logo + text overlays with drag, corner-resize, and flexible backgrounds, composited onto the image and saved; (7) AI Mode (/studio/ai-mode) — drop a markdown doc, Claude extracts the posts by section, set image type + tick destination channels (with Select all), and it bulk-creates one draft per post x channel. Per Kevin's automation directive, images auto-generate: each draft enqueues an image job and a self-draining background queue (instrumentation.ts+lib/imageQueue.ts) generates them with no clicks, even with no tab open; the engine is chosen intelligently per post — Claude tags each Grok (photographic) or OpenAI (graphic/clean-layout) during extraction, with an Auto/Grok/OpenAI override. VERIFIED: Kevin confirmed a live publish to his LinkedIn worked end-to-end; an AI Mode E2E (extract -> draft -> auto-image) passed on real infra; four sample drafts were seeded into prod for review. Still open: LinkedIn Page API posting waits on LinkedIn's review; Kevin's approve gate unchanged; the move-off-Predis confirm still stands. A LinkedIn URN/API reference lives atkindredros-social/Kindred rOS Social Media/LinkedIn URN and API Reference.md. Proposed next: auto-approve / scheduled auto-publish.