Phase 1 · Days 1-30
Day 21 · 10 days left in phase →

Social

On track

NextThe in-house tool is now a full web-native Studio, live in beta on `kindred-ros-ops` (v26) and decoupled from the vault (the vault is internal-only; external posts live in a web store on the Fly volume). It does create-from-scratch, AI caption + image generation, four publishing channels (FB / IG / LinkedIn Page / LinkedIn Kevin), and an AI Mode bulk import that turns a document into routed drafts with auto-generated images and an intelligently chosen image engine per post. Image gen is deployed with funded OpenAI + xAI keys (SOC-14 deploy gate closed). Next automation layer is auto-approve / scheduled auto-publish so an imported doc can go upload -> drafted -> imaged -> posted on a schedule with no clicks (Kevin's minimal-intervention goal). Kevin to review the Studio at `/studio` and run the in-app Connect-LinkedIn once to enable token auto-refresh.

Waiting onKevin's approve-to-post gate stays before anything publishes; LinkedIn Page (organization) posting is blocked on LinkedIn's Community Management API review (LinkedIn-side, not ours) — LinkedIn Kevin personal posting is verified working; confirm the move off Predis (reverses his 2026-05-27 plan); Kevin to re-authorize LinkedIn before mid-August unless the in-app OAuth refresh is connected first

Updated 2026-06-15

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 /review URL 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, with originalCaption preserved 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" (now claude-sonnet-4-6, structured caption + hashtags + CTA), image gen, approve, publish, delete, all via a unified resolveDraft; (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 (bucket kindredros-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 at kindredros-social/Kindred rOS Social Media/LinkedIn URN and API Reference.md. Proposed next: auto-approve / scheduled auto-publish.

Recent

  • 2026-06-16Sweep. Reconciled this file with social.md. SOC-14 and SOC-10 marked done and deployed: the tool shipped live to kindred-ros-ops (v26) as a full web-native Studio with funded image-gen keys; Instagram, Facebook, and LinkedIn (Kevin personal) post live and Kevin's personal publish is verified end to end. The one open external item is LinkedIn Page posting, which waits on LinkedIn's Community Management API review. The Studio is now decoupled from the vault (external posts live in a web store on the Fly volume). The move-off-Predis confirm is a live ask now that Kevin is back. SOC-7 (weekly cadence) folds into SOC-15 (scheduled auto-publish of approved drafts), still ready.
  • 2026-06-15Staged a week of on-voice LinkedIn drafts (Mon to Fri) in 04 - Social [JC, BK, KE]/Drafts/ so /review has real content the moment social deploys. Drafted strictly from the GD founder-voice docs (Brand Voice and Messaging, Founder Voice and Writing Rules) and the weekly rhythm. Voice-scanned clean: no em dashes, no double hyphens in prose, no banned words, fundraiser audience held. authorStatus: draft, pending a voice-review pass before moving to ready-for-kevin. Wednesday is founder first-person (Kevin's voice) and needs his personal sign-off.
  • 2026-06-09SOC-14 built and pushed to master (e839944, 33a6427, b45d074). Branded image generation (dual-model, no-logos guard, on-brand prompt scaffolder, "Generate visual" panel on /review) plus publishing of generated/Unsplash/manual images to LinkedIn, Facebook, and Instagram. IG gap closed with a signed short-lived public JPEG route (public-image/[draftId] + lib/assetUrl.ts); sharp-in-Docker tracer trap fixed and verified on the local standalone build. Additive alongside Unsplash; Kevin's approve gate unchanged. Remaining is Ben's deploy gate: set OPENAI_API_KEY + XAI_API_KEY (optionally PUBLIC_BASE_URL / ASSET_URL_SECRET), deploy, and the first deploy confirms sharp loads in the Alpine container. Prompt 4 (logo-stamp) deferred. SOC-13 (document the system) now unblocked since publishing has landed.
  • 2026-06-06Status sweep. SOC-9 / SOC-11 / SOC-12 moved to done. The in-house tool was committed and deployed on 2026-06-05 (commit c06ddb3), live at /review and /inbox, per Ben note 2026-06-05 2330 SHIPPED. Predis files were deleted in the same commit. SOC-10 (Ben, Fly env vars plus the one-time LinkedIn OAuth token run) stays open for v1 acceptance. SOC-7 and SOC-13 (JC) still ready. - 2026-06-05 (later still): SOC-9 / SOC-11 / SOC-12 built in the working tree on the in-house path. Eleven new files (lib/socialDrafts, lib/socialState, lib/unsplash, five /api/social/* routes, rewritten /review layout+page, .env.example update, vault Drafts/_TEMPLATE.md), seven Predis files deleted (lib/predis, four /api/predis/* routes, scripts/predis-smoke), lib/generate.ts reverted to pre-Predis. Typechecks clean. Not committed, not pushed, not deployed. Full handoff in Ben note 2026-06-05 2310 GIT COMMIT READY. SOC-10 is your task: confirm LinkedIn token has w_organization_social scope and Meta FB-page token is fresh. - 2026-06-05 (later): Pivot to an in-house social tool, Predis dropped. Predis was not producing favorable responses; the voice docs live in this vault; Ben has the social API access to post on Kevin's approve. SOC-2 through SOC-6 and SOC-8 marked superseded (the working-tree Predis code is shelved, not committed). Added SOC-9 through SOC-13 for the in-house build, reusing the existing on-voice generation and the existing app/api/publish direct-post route. SOC-1 reframed as key-scrub hygiene. SOC-7 retargeted to the in-house loop. The two Predis build handoffs in Ben's inbox marked superseded. Reverses Kevin's 2026-05-27 Predis confirmation, so flagged for his sign-off (Friday).
  • 2026-06-05SOC-2 through SOC-5 built end-to-end in kindredros-social working tree (now superseded, see above). Full handoff in Ben note 2026-06-05 2245 (now marked superseded).
Read more — full task list (social-tasks.md)

Social Media Tasks

Read at session start. Update statuses here as work moves. Edit only this file. The Obsidian Git plugin syncs it; the Ops Dashboard renders it.

Direction (2026-06-05)

Evolved 2026-06-15: this in-house model became a full web-native Studio at /studio (live, v26), decoupled from the vault. The original vault-draft-to-/review flow below is kept as the founding record; the current model is in the Open section and social.md.

Building an in-house social tool, off Predis. Predis was not producing favorable responses, and the voice docs already live in this vault. The model: draft on-voice from the vault docs, surface drafts for Kevin to review and approve, and post approved content directly through the social platform APIs (access in hand). Nothing posts without Kevin's approval. This reverses the Predis plan Kevin confirmed 2026-05-27, so confirm with him; the build is Ben's to proceed. Reuses the existing on-voice generation and the existing app/api/publish direct-post route in kindredros-social.

In-house build

  • SOC-9 Spec the in-house tool end to end (generate on-voice from the vault docs, review and approve surface for Kevin, direct API post on approve). done (deployed 2026-06-05, commit c06ddb3). Working-tree build complete. Loop: JC authors markdown drafts in 04 - Social [JC, BK, KE]/Drafts/, Obsidian Git pushes, dashboard reads live via lib/socialDrafts.ts, Kevin approves on /review, Ben publishes via /api/social/publish (which calls existing lib/linkedin.ts / lib/meta.ts). State on Fly volume at /data/social/state.json so no write PAT is needed against the vault. Template at 04 - Social [JC, BK, KE]/Drafts/_TEMPLATE.md. Full handoff in Ben note 2026-06-05 2310 GIT COMMIT READY.
  • SOC-10 Confirm the platform set and connect each social API. done (deployed). Instagram, Facebook, and LinkedIn (Kevin personal) post live in prod; Kevin's LinkedIn personal publish is verified end to end. LinkedIn Page (org urn:li:organization:118344127) is wired but waits on LinkedIn's Community Management API review (LinkedIn-side, not ours). LinkedIn OAuth auto-refresh is built (a Connect-LinkedIn button) so Kevin's 60-day token refreshes hands-off once he Connects once. Tokens live in Fly secrets.
  • SOC-11 Build or confirm Kevin's review and approve surface. done (deployed 2026-06-05, commit c06ddb3). New app/review/ (outside the (app) Ops group so Kevin doesn't see Ops chrome). One card per draft: image preview via /api/social/image/[draftId], caption, voice-scan flags surfaced inline, Approve + Publish buttons with Publish disabled until Approve. Filter chips for ready / approved / published / rejected. Auth uses the existing OAuth allowlist; Kevin signs in as kevin@kindredros.com.
  • SOC-12 Wire approve-to-post: on Kevin's approve, publish directly via the social APIs. done (deployed 2026-06-05, commit c06ddb3). /api/social/approve (records approvedBy + approvedAt) and /api/social/publish (calls postToLinkedIn / postToFacebook / postToInstagram from existing lib/linkedin.ts + lib/meta.ts). Publish refuses if not approved. Per the pivot: Kevin approves, Ben publishes when monitoring. Publish button is enabled only after Approve. State persisted on the Fly volume.
  • SOC-7 Stand up the weekly scheduled generation task. ready · owner: JC · after the manual approve-to-post loop is stable.
  • SOC-13 Document the in-house design (replaces the retired Predis map). done 2026-06-09. Written as 03 - Jean-Claude Lab [JC]/Reference Docs/Social System (in-house) Technical Map: the full end-to-end map (author to review to approve to publish, both image sources, the signed public-JPEG route for IG, volume state, deploy secrets, commit history, and what's not done). No May 27 Predis map file existed to replace, so this is the fresh canonical reference.
  • SOC-14 Branded image generation + multi-channel image publishing (Asset Studio engine ported from seen-ops). done, deployed (image gen live on kindred-ros-ops v26 with funded OpenAI + xAI keys; deploy gate closed). Built and pushed to master across three commits: e839944 (generated images as a third source alongside Unsplash and manual, dual-model /api/social/generate-asset with xAI + OpenAI + no-logos guard, lib/assetPresets.ts, lib/assetPrompt.ts, the "Generate visual (author)" panel on /review), 33a6427 (publish generated/Unsplash/manual images to LinkedIn and Facebook), b45d074 (publish to Instagram). The Instagram gap (public URL + JPEG only) is closed by app/api/social/public-image/[draftId] — a public, unauthenticated route gated by a short-lived (30-min) HMAC signature, transcoding to JPEG with sharp; signing in lib/assetUrl.ts keyed on ASSET_URL_SECRET (falls back to NEXTAUTH_SECRET, so no new required secret). The sharp-in-Docker tracer trap is fixed (.npmrc node-linker=hoisted, outputFileTracingIncludes forces sharp/@img into the standalone bundle, Dockerfile copies .npmrc); verified on the local macOS standalone build. Generated PNGs persist on the Fly volume; additive alongside Unsplash; Kevin's approve gate unchanged. Deployed 2026-06-15: the OpenAI key (funded service account, gpt-image-1-mini) and the xAI key (Grok) are set and verified generating in prod, so the SOC-14 deploy gate is closed. Prompt 4 (the logo-stamp compositor) also shipped, as the Studio stamp editor (app/studio/StampEditor.tsx).
  • SOC-15 Scheduled auto-publish (Kevin's hands-off goal). ready · owner: JC. The next automation layer after AI Mode: a scheduler that auto-publishes drafts on their scheduledFor date/time with no clicks, so an imported doc goes upload → drafted → imaged → posted on schedule. MUST respect the hard approval gate — design as auto-publish of already-approved drafts (an opt-in "auto-publish when approved + scheduled" toggle), not a bypass of Kevin's approve. Build on the existing self-draining background-queue pattern (instrumentation.ts + lib/imageQueue.ts) with a publish queue, plus a per-draft schedule picker in the Studio. NOTE: the logo/text-stamp compositor SOC-14 left deferred (its "Prompt 4") shipped this session as the Studio stamp editor (app/studio/StampEditor.tsx).

Open

  • The tool is now a full web-native Studio at /studio, live on kindred-ros-ops (v26), decoupled from the vault. Create-from-scratch or AI Mode bulk import, auto image generation, approve, publish to Facebook / Instagram / LinkedIn Page / LinkedIn Kevin. Full build logged in social.md.
  • The one external block: LinkedIn Page (org) posting waits on LinkedIn's Community Management API review (LinkedIn-side, not ours). The other three channels post live.
  • Confirm the move off Predis with Kevin (reverses his 2026-05-27 confirmation). Now a live ask, he is back.
  • Kevin to run the in-app Connect-LinkedIn once to enable token auto-refresh (before mid-August).
  • Posting on Kevin's approve only. Keep the approval gate hard.

Security / hygiene

  • SOC-1 Scrub and rotate the exposed Predis key from git history. ready · owner: Ben/Kevin · why: a live key sits in the May 27 map in git history. Still worth doing even though Predis is retired.

Superseded (Predis pipeline, shelved 2026-06-05, do not commit or deploy)

  • [~] SOC-2 lib/predis.ts. superseded. Built in the working tree, not shipped. Shelved with the Predis pivot.
  • [~] SOC-3 lib/calendar.ts (Predis pipeline version). superseded. The vault-calendar reader idea may be reused for the in-house tool, but the Predis-coupled build is shelved.
  • [~] SOC-4 Predis /review page. superseded. The in-house review surface (SOC-11) replaces it; reuse parts if useful.
  • [~] SOC-5 Predis generate + webhook routes. superseded. No Predis webhook in the in-house model.
  • [~] SOC-6 Manual test into Kevin's Predis queue. superseded. No Predis send.
  • [~] SOC-8 Update the May 27 map with the Predis hybrid design. superseded by SOC-13.

Updates

  • 2026-05-27: Predis automation plan confirmed by Kevin (now reversed, see the 2026-06-05 pivot).
  • 2026-06-01: Build update sent to Kevin.
  • 2026-06-01: Ben decided app moves to kindred-ros-ops.fly.dev.
  • 2026-06-05: SOC-2 through SOC-5 built end-to-end in kindredros-social working tree (now superseded, see above). Full handoff in Ben note 2026-06-05 2245 (now marked superseded).
  • 2026-06-05 (later): Pivot to an in-house social tool, Predis dropped. Predis was not producing favorable responses; the voice docs live in this vault; Ben has the social API access to post on Kevin's approve. SOC-2 through SOC-6 and SOC-8 marked superseded (the working-tree Predis code is shelved, not committed). Added SOC-9 through SOC-13 for the in-house build, reusing the existing on-voice generation and the existing app/api/publish direct-post route. SOC-1 reframed as key-scrub hygiene. SOC-7 retargeted to the in-house loop. The two Predis build handoffs in Ben's inbox marked superseded. Reverses Kevin's 2026-05-27 Predis confirmation, so flagged for his sign-off (Friday).
  • 2026-06-05 (later still): SOC-9 / SOC-11 / SOC-12 built in the working tree on the in-house path. Eleven new files (lib/socialDrafts, lib/socialState, lib/unsplash, five /api/social/* routes, rewritten /review layout+page, .env.example update, vault Drafts/_TEMPLATE.md), seven Predis files deleted (lib/predis, four /api/predis/* routes, scripts/predis-smoke), lib/generate.ts reverted to pre-Predis. Typechecks clean. Not committed, not pushed, not deployed. Full handoff in Ben note 2026-06-05 2310 GIT COMMIT READY. SOC-10 is your task: confirm LinkedIn token has w_organization_social scope and Meta FB-page token is fresh.
  • 2026-06-06: Status sweep. SOC-9 / SOC-11 / SOC-12 moved to done. The in-house tool was committed and deployed on 2026-06-05 (commit c06ddb3), live at /review and /inbox, per Ben note 2026-06-05 2330 SHIPPED. Predis files were deleted in the same commit. SOC-10 (Ben, Fly env vars plus the one-time LinkedIn OAuth token run) stays open for v1 acceptance. SOC-7 and SOC-13 (JC) still ready.
  • 2026-06-09: SOC-14 built and pushed to master (e839944, 33a6427, b45d074). Branded image generation (dual-model, no-logos guard, on-brand prompt scaffolder, "Generate visual" panel on /review) plus publishing of generated/Unsplash/manual images to LinkedIn, Facebook, and Instagram. IG gap closed with a signed short-lived public JPEG route (public-image/[draftId] + lib/assetUrl.ts); sharp-in-Docker tracer trap fixed and verified on the local standalone build. Additive alongside Unsplash; Kevin's approve gate unchanged. Remaining is Ben's deploy gate: set OPENAI_API_KEY + XAI_API_KEY (optionally PUBLIC_BASE_URL / ASSET_URL_SECRET), deploy, and the first deploy confirms sharp loads in the Alpine container. Prompt 4 (logo-stamp) deferred. SOC-13 (document the system) now unblocked since publishing has landed.
  • 2026-06-15: Staged a week of on-voice LinkedIn drafts (Mon to Fri) in 04 - Social [JC, BK, KE]/Drafts/ so /review has real content the moment social deploys. Drafted strictly from the GD founder-voice docs (Brand Voice and Messaging, Founder Voice and Writing Rules) and the weekly rhythm. Voice-scanned clean: no em dashes, no double hyphens in prose, no banned words, fundraiser audience held. authorStatus: draft, pending a voice-review pass before moving to ready-for-kevin. Wednesday is founder first-person (Kevin's voice) and needs his personal sign-off.
  • 2026-06-16: Sweep. Reconciled this file with social.md. SOC-14 and SOC-10 marked done and deployed: the tool shipped live to kindred-ros-ops (v26) as a full web-native Studio with funded image-gen keys; Instagram, Facebook, and LinkedIn (Kevin personal) post live and Kevin's personal publish is verified end to end. The one open external item is LinkedIn Page posting, which waits on LinkedIn's Community Management API review. The Studio is now decoupled from the vault (external posts live in a web store on the Fly volume). The move-off-Predis confirm is a live ask now that Kevin is back. SOC-7 (weekly cadence) folds into SOC-15 (scheduled auto-publish of approved drafts), still ready.