Create content-hub-phase5-planning.md via n8n
This commit is contained in:
parent
112c23d44f
commit
37681a553d
195
PBS/Tech/Projects/content-hub-phase5-planning.md
Normal file
195
PBS/Tech/Projects/content-hub-phase5-planning.md
Normal file
@ -0,0 +1,195 @@
|
||||
---
|
||||
project: content-hub-phase5-planning
|
||||
type: project-plan
|
||||
status: active
|
||||
tags:
|
||||
- pbs
|
||||
- flask
|
||||
- mysql
|
||||
- n8n
|
||||
- instagram
|
||||
- automation
|
||||
- docker
|
||||
created: 2026-03-19
|
||||
updated: 2026-03-19
|
||||
path: PBS/Tech/Projects/
|
||||
---
|
||||
|
||||
# PBS Content Hub — Phase 5 Planning Decisions
|
||||
|
||||
## Context
|
||||
|
||||
Phases 1–4 of the Instagram Automation & Content Hub master plan are
|
||||
complete:
|
||||
- ✅ Phase 1 — MySQL schema with single `instagram_posts` table
|
||||
- ✅ Phase 2 — Reply workflow refactored with error notifications
|
||||
- ✅ Phase 3 — WordPress → MySQL sync via webhook
|
||||
- ✅ Phase 4 — Instagram reel publish webhook capturing reel IDs
|
||||
|
||||
Phase 5 focuses on building the Content Hub UI layer that gives Jenny and
|
||||
her assistant self-service access to recipe/reel management — removing
|
||||
Travis as the manual middleman for MySQL lookups.
|
||||
|
||||
---
|
||||
|
||||
## Key Architecture Decisions
|
||||
|
||||
### 1. Recipe-to-Reel Linking Strategy
|
||||
**Decision:** Manual selection in Content Hub (Option B)
|
||||
|
||||
Jenny selects the recipe from a dropdown when creating a reel record in the
|
||||
hub. This auto-populates the post ID, keyword, and URL. No caption parsing,
|
||||
no fragile keyword matching.
|
||||
|
||||
**Rationale:** Jenny is already in the hub building captions — selecting
|
||||
the recipe is one extra dropdown click. Most reliable approach with zero
|
||||
parsing ambiguity.
|
||||
|
||||
### 2. Reel Record Lifecycle (Two-Stage)
|
||||
**Decision:** Local-first, then matched to live data
|
||||
|
||||
- **Stage 1 (Pre-publish):** Jenny creates a reel record in the Content Hub
|
||||
before anything exists on Instagram. This is a local planning record —
|
||||
working title, linked recipe, keyword, built caption.
|
||||
- **Stage 2 (Post-publish):** After Jenny posts the reel, the Instagram
|
||||
webhook fires, n8n writes the reel ID to `instagram_posts` in MySQL. The
|
||||
hub reads from that table and matches it to the local record.
|
||||
|
||||
### 3. n8n Stays Decoupled From the Hub
|
||||
**Decision:** n8n is dumb to the hub
|
||||
|
||||
- n8n writes to `instagram_posts` in MySQL — that's its job
|
||||
- n8n does NOT call the Content Hub API or know about hub reel records
|
||||
- The Content Hub reads from `instagram_posts` to display what's live
|
||||
- The hub owns the matching logic between its local records and n8n's data
|
||||
|
||||
**Rationale:** Keeps n8n focused on automation. The hub is the human
|
||||
workflow layer on top.
|
||||
|
||||
### 4. Auto-Match Routine
|
||||
**Decision:** Triggered by n8n ping after new insert
|
||||
|
||||
After n8n writes a new row to `instagram_posts`, it sends a simple ping to
|
||||
the hub (`POST /api/match/run`). The hub then runs the matching logic:
|
||||
|
||||
```
|
||||
For each hub reel record in "Ready" status (no reel ID linked):
|
||||
→ Look in instagram_posts for unmatched rows where:
|
||||
- post_id matches (recipe link) OR keyword matches
|
||||
→ Single match → auto-link, status → "Live — Matched" ✅
|
||||
→ Multiple matches → flag as "Needs Review" 🟡
|
||||
→ No match → leave as-is
|
||||
```
|
||||
|
||||
Jenny's manual match UI is the fallback for anything the auto-matcher can't
|
||||
confidently link.
|
||||
|
||||
### 5. Recipe Dropdown Source
|
||||
**Decision:** MySQL recipes table (not WordPress REST API)
|
||||
|
||||
The recipe dropdown in the reel creation form pulls from the local MySQL
|
||||
recipes table, which is already kept in sync via the WordPress publish
|
||||
webhook. Faster, no external API calls during form interactions.
|
||||
|
||||
---
|
||||
|
||||
## UI Structure Decisions
|
||||
|
||||
### Reel Detail Page — Tabbed Layout
|
||||
```
|
||||
[ Overview ] [ Caption Builder ]
|
||||
```
|
||||
|
||||
**Overview tab:**
|
||||
- Reel Title (free text)
|
||||
- Recipe dropdown (from MySQL) → auto-fills keyword + URL
|
||||
- Keyword (editable — this is the recipe review/confirm step)
|
||||
- Recipe URL (read-only)
|
||||
- Status indicator
|
||||
- Save / Delete
|
||||
|
||||
**Caption Builder tab:**
|
||||
- Select library blocks (hashtags, links, CTAs, about snippets)
|
||||
- Preview assembled caption
|
||||
- Copy to clipboard
|
||||
|
||||
### Reel List View
|
||||
Data points shown per reel (layout TBD — getting Jenny's input on table vs
|
||||
cards):
|
||||
- Reel title
|
||||
- Linked recipe name (or "No Recipe" warning)
|
||||
- Keyword
|
||||
- Status (color dot + label)
|
||||
- Date created or last updated
|
||||
|
||||
### Recipe Review UI
|
||||
**Decision:** Not a separate screen. Baked into the reel creation flow —
|
||||
when Jenny selects a recipe from the dropdown, she sees the record (title,
|
||||
URL, keyword) and confirms/edits the keyword right there.
|
||||
|
||||
### Manual Match Correction
|
||||
A "Link Reel" button on flagged records in the dashboard. Jenny selects
|
||||
from a list of unmatched `instagram_posts` rows to connect the dots.
|
||||
|
||||
---
|
||||
|
||||
## Reel Status States (Draft)
|
||||
|
||||
1. **Draft** — reel record created, no recipe linked yet
|
||||
2. **Ready** — recipe linked, keyword confirmed, caption built. Waiting to
|
||||
be posted
|
||||
3. **Live — Matched** — Instagram webhook received, reel ID attached,
|
||||
auto-reply active
|
||||
4. **Live — Unmatched / Needs Review** — auto-match couldn't confidently
|
||||
link
|
||||
|
||||
---
|
||||
|
||||
## Open Questions (Still To Decide)
|
||||
|
||||
- [ ] Reel list layout: table rows vs cards (get Jenny's feedback)
|
||||
- [ ] Jenny's assistant access: same login or separate user accounts?
|
||||
- [ ] Status Dashboard details: per-reel health indicators + system health
|
||||
panel (next planning session)
|
||||
- [ ] Database schema for hub reel records table (next planning session)
|
||||
- [ ] Define green/yellow/red status thresholds in detail
|
||||
|
||||
---
|
||||
|
||||
## Target Automation Flow (Full Picture)
|
||||
|
||||
```
|
||||
Jenny creates reel record in hub → selects recipe → builds caption
|
||||
↓
|
||||
Jenny posts reel to Instagram
|
||||
↓
|
||||
Instagram webhook → n8n → writes reel ID to instagram_posts
|
||||
↓
|
||||
n8n pings hub (POST /api/match/run)
|
||||
↓
|
||||
Hub auto-match runs:
|
||||
- Finds match → links record → status = Live — Matched ✅
|
||||
- No confident match → status = Needs Review 🟡
|
||||
↓
|
||||
Comment comes in on Instagram → n8n looks up instagram_posts → sends DM +
|
||||
reply
|
||||
↓
|
||||
Dashboard shows green across the board 🟢
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
- [ ] Define reel status states in detail (green/yellow/red thresholds)
|
||||
- [ ] Sketch Status Dashboard UI
|
||||
- [ ] Define database schema for hub reel records
|
||||
- [ ] Get Jenny's feedback on reel list layout (table vs cards)
|
||||
- [ ] Address assistant access model
|
||||
- [ ] Build once requirements are locked
|
||||
|
||||
---
|
||||
|
||||
*Project: Plant Based Southerner Content Hub*
|
||||
*Planning Session: March 19, 2026*
|
||||
*Participants: Travis & Claude*
|
||||
Loading…
Reference in New Issue
Block a user