VinOS Agent commited on
Commit
54fa6d8
Β·
1 Parent(s): e498faf

feat: integrate elite social post prompt skill into AI remixer and dashboard UI

Browse files
ai-content.js CHANGED
@@ -1,4 +1,10 @@
1
  const apiCaller = require('./skills/api_caller');
 
 
 
 
 
 
2
 
3
  class AIContentRemixer {
4
  async remix(scrapedData) {
@@ -6,61 +12,128 @@ class AIContentRemixer {
6
  return { success: false, error: 'Input post data invalid' };
7
  }
8
 
9
- const prompt = `You are a social media growth expert. Below is an original post from ${scrapedData.platform}.
10
- Your mission is to REMIX this into 3 high-performance content variants for multiple platforms.
11
 
12
- Original Content:
13
- "${scrapedData.text}"
 
14
 
15
- Brand Voice: Authoritative yet accessible, professional but engaging.
16
- Language: Provide each variant in BOTH English and Bahasa Indonesia.
17
 
18
- PLATFORM CONSTRAINTS:
19
- 1. Instagram (IG): Max 2200 characters. Hook-focused.
20
- 2. Threads: STRICT MAX 500 characters.
21
- 3. LinkedIn: Professional tone. Max 3000 chars.
22
- 4. X (Twitter): STRICT MAX 280 characters.
23
- 5. Facebook: Informative. No strict limit.
24
- 6. Pinterest: Visual & Keyword focused. Max 500 chars for description.
25
 
26
- VARIANT 1: THE HOOK-DRIVEN LITE (Single Post)
27
- - Focus: Highly shareable, concise, bold statement.
 
28
 
29
- VARIANT 2: THE CAROUSEL VALUE BOMB (Carousel)
30
- - Focus: 3-5 Slide Breakdown.
31
- - Each slide needs its own text and visual prompt.
32
 
33
- VARIANT 3: THE STORY-TELLING ADAPTATION (Single Post)
34
- - Focus: Reframe it as a personal or professional observation.
35
 
36
- OUTPUT FORMAT: JSON ONLY.
37
- Structure:
38
- {
39
- "variant_1": { ... },
40
- "variant_2": {
41
- "title": "...",
42
- "slides": [
43
- { "text_en": "...", "text_id": "...", "visual_prompt": "..." },
44
- ...
45
- ],
46
- "ig_en": "...", "ig_id": "...", // Summary for caption
47
- ...
48
- },
49
- ...
50
- }
51
 
52
- IMPORTANT: Ensure "threads_..." fields are < 480 chars and "x_..." fields are < 270 chars.`;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
 
54
- console.log(`[AI Remix] Generating variants...`);
55
  const result = await apiCaller.callOpenRouter([{ role: 'user', content: prompt }]);
56
 
57
  if (result.success) {
58
  try {
59
- // Strip markdown wrappers
60
  const cleanJson = result.data.replace(/```json|```/g, '').trim();
61
  const data = JSON.parse(cleanJson);
62
  return { success: true, data };
63
  } catch (error) {
 
 
 
 
 
 
 
 
64
  console.error('[AI Remix] JSON parse error:', error.message);
65
  return { success: false, error: 'Failed to parse AI response' };
66
  }
 
1
  const apiCaller = require('./skills/api_caller');
2
+ const fs = require('fs');
3
+ const path = require('path');
4
+
5
+ // Load the social post skill (best practice prompts & frameworks)
6
+ const SKILL_PATH = path.join(__dirname, 'prompts', 'social_post_skill.md');
7
+ const SOCIAL_SKILL = fs.existsSync(SKILL_PATH) ? fs.readFileSync(SKILL_PATH, 'utf-8') : '';
8
 
9
  class AIContentRemixer {
10
  async remix(scrapedData) {
 
12
  return { success: false, error: 'Input post data invalid' };
13
  }
14
 
15
+ const prompt = `You are an elite social media content strategist and copywriter for the Indonesian creator/B2B market.
16
+ You have mastered the following best practices and frameworks. Apply them rigorously:
17
 
18
+ === SOCIAL POST SKILL (MASTER KNOWLEDGE) ===
19
+ ${SOCIAL_SKILL.substring(0, 4000)}
20
+ === END SKILL ===
21
 
22
+ ---
 
23
 
24
+ YOUR TASK: Remix the source content below into 3 high-performance social media post variants.
25
+ Apply the 4E framework (Emotion, Edge, Ease, Exposure) to ALL variants.
26
+ Use HOOK FORMULAS from the skill library above (Curiosity, Bold Claim, Problem-Solution, etc.)
 
 
 
 
27
 
28
+ SOURCE CONTENT (from ${scrapedData.platform || 'web'}):
29
+ "${scrapedData.text.substring(0, 1500)}"
30
+ ${scrapedData.engagement ? `Engagement signals: ${JSON.stringify(scrapedData.engagement)}` : ''}
31
 
32
+ BRAND VOICE: Authoritative yet accessible. Professional but genuinely human.
33
+ LANGUAGES: Generate BOTH English (EN) and Bahasa Indonesia (ID) for every platform.
34
+ NICHE CONTEXT: AI tools, productivity, business growth, creator economy.
35
 
36
+ ---
 
37
 
38
+ PLATFORM CHARACTER LIMITS (STRICT β€” do NOT exceed):
39
+ - Instagram (ig): Max 2,200 chars. First 125 chars = visible hook. End with save/tag CTA.
40
+ - Threads: STRICT MAX 480 chars. Conversational. End with a question.
41
+ - LinkedIn: Max 3,000 chars. First 2 lines must force 'see more' click. Short paragraphs.
42
+ - X / Twitter (x): STRICT MAX 270 chars. Sharp. Opinionated. 1 idea only.
43
+ - Facebook (fb): Max 250 chars recommended. Warm. Community-focused. Ask a question.
44
+ - Pinterest: Max 500 chars. Keyword-rich. Aspirational. Tells them what they'll GET.
45
+
46
+ ---
47
+
48
+ VARIANT 1: HOOK-DRIVEN SINGLE POST
49
+ Use a BOLD CLAIM or CURIOSITY hook formula. Punchy, highly shareable.
50
+ Add: 8-10 niche hashtags, content pillar type (educate/inspire/entertain/engage/convert)
 
 
51
 
52
+ VARIANT 2: CAROUSEL VALUE BOMB (Educational Multi-Slide)
53
+ Generate 5-7 slides. Structure:
54
+ - Slide 1: Bold hook headline (makes them swipe within 2 seconds)
55
+ - Slides 2-5: One value point per slide (numbered, max 25 words each)
56
+ - Slide 6: Summary/TL;DR
57
+ - Slide 7: CTA slide ("Save this πŸ”–" or "Comment your answer πŸ‘‡")
58
+ Each slide needs: text_en, text_id, visual_prompt (specify if text/face β†’ use Nano Banana routing)
59
+
60
+ VARIANT 3: PERSONAL STORY / CONTRARIAN TAKE
61
+ Use a STORYTELLING or CONTRARIAN hook. Build narrative arc: situation β†’ insight β†’ result.
62
+ End with an engaging discussion question.
63
+
64
+ ---
65
+
66
+ OUTPUT: JSON ONLY. No markdown. No commentary. Valid parseable JSON.
67
+
68
+ {
69
+ "variant_1": {
70
+ "title": "Post title for internal reference",
71
+ "pillar": "educate|inspire|entertain|engage|convert",
72
+ "ig_en": "...", "ig_id": "...",
73
+ "threads_en": "...", "threads_id": "...",
74
+ "linkedin_en": "...", "linkedin_id": "...",
75
+ "x_en": "...", "x_id": "...",
76
+ "fb_en": "...", "fb_id": "...",
77
+ "pinterest_en": "...", "pinterest_id": "...",
78
+ "visual_prompt": "Detailed image generation prompt. Mention if text/face needed.",
79
+ "hashtags": ["#tag1", "#tag2"],
80
+ "best_time_to_post": "e.g. Tuesday 19:00 WIB",
81
+ "engagement_notes": "Why this will drive engagement"
82
+ },
83
+ "variant_2": {
84
+ "title": "...",
85
+ "pillar": "educate",
86
+ "slides": [
87
+ { "slide": 1, "text_en": "...", "text_id": "...", "visual_prompt": "..." },
88
+ { "slide": 2, "text_en": "...", "text_id": "...", "visual_prompt": "..." },
89
+ { "slide": 3, "text_en": "...", "text_id": "...", "visual_prompt": "..." },
90
+ { "slide": 4, "text_en": "...", "text_id": "...", "visual_prompt": "..." },
91
+ { "slide": 5, "text_en": "...", "text_id": "...", "visual_prompt": "..." }
92
+ ],
93
+ "ig_en": "Carousel caption summary for Instagram (with hook + swipe CTA)",
94
+ "ig_id": "...",
95
+ "threads_en": "...", "threads_id": "...",
96
+ "linkedin_en": "Document post caption for LinkedIn",
97
+ "linkedin_id": "...",
98
+ "x_en": "...", "x_id": "...",
99
+ "hashtags": ["..."],
100
+ "visual_prompt": "Cover slide visual prompt",
101
+ "best_time_to_post": "...",
102
+ "engagement_notes": "..."
103
+ },
104
+ "variant_3": {
105
+ "title": "...",
106
+ "pillar": "inspire|engage",
107
+ "ig_en": "...", "ig_id": "...",
108
+ "threads_en": "...", "threads_id": "...",
109
+ "linkedin_en": "...", "linkedin_id": "...",
110
+ "x_en": "...", "x_id": "...",
111
+ "fb_en": "...", "fb_id": "...",
112
+ "pinterest_en": "...", "pinterest_id": "...",
113
+ "visual_prompt": "...",
114
+ "hashtags": ["..."],
115
+ "best_time_to_post": "...",
116
+ "engagement_notes": "..."
117
+ }
118
+ }`;
119
 
120
+ console.log(`[AI Remix] Generating variants with Social Post Skill...`);
121
  const result = await apiCaller.callOpenRouter([{ role: 'user', content: prompt }]);
122
 
123
  if (result.success) {
124
  try {
 
125
  const cleanJson = result.data.replace(/```json|```/g, '').trim();
126
  const data = JSON.parse(cleanJson);
127
  return { success: true, data };
128
  } catch (error) {
129
+ // Try to extract JSON from response if mixed with text
130
+ const jsonMatch = result.data.match(/\{[\s\S]*\}/);
131
+ if (jsonMatch) {
132
+ try {
133
+ const data = JSON.parse(jsonMatch[0]);
134
+ return { success: true, data };
135
+ } catch(e2) {}
136
+ }
137
  console.error('[AI Remix] JSON parse error:', error.message);
138
  return { success: false, error: 'Failed to parse AI response' };
139
  }
prompts/social_post_skill.md ADDED
@@ -0,0 +1,308 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 🎯 Social Post Creation Skill
2
+ # VinOS Social Autopilot β€” Master Prompt Library
3
+ # Based on best practices from Hootsuite, Buffer, Sprinklr, SocialInsider (2025)
4
+
5
+ ---
6
+
7
+ ## THE CORE FRAMEWORK: 4E Model
8
+
9
+ Every great social post must satisfy at least 3 of these 4:
10
+ - **Emotion** β€” makes someone feel something (awe, surprise, relief, pride, FOMO)
11
+ - **Edge** β€” bold opinion, contrarian take, or unexpected angle
12
+ - **Ease** β€” scannable in 3 seconds, clear visual hierarchy
13
+ - **Exposure** β€” repurposable across platforms with minor adaptation
14
+
15
+ ---
16
+
17
+ ## HOOK FORMULAS (First 1-3 Lines Are Everything)
18
+
19
+ ### Category A: Curiosity / Open Loop
20
+ - "Nobody talks about this, but [INSIGHT]..."
21
+ - "I was told NOT to share this. Here it is anyway:"
22
+ - "What [experts/gurus] won't tell you about [TOPIC]:"
23
+ - "The craziest thing happened when I tried [ACTION]..."
24
+ - "Here's what I wish I knew before [COMMON MISTAKE]:"
25
+ - "I did [EXPERIMENT] for [X] days. Here's what actually happened:"
26
+
27
+ ### Category B: Bold Claim / Pattern Interrupt
28
+ - "Stop [COMMON ACTION]. It's costing you [RESULT]."
29
+ - "[NUMBER] things that separate [WINNERS] from [LOSERS]:"
30
+ - "Hot take: [CONTRARIAN OPINION]."
31
+ - "This changed how I think about [TOPIC] forever:"
32
+ - "Most [AUDIENCE] are doing [THING] wrong. Here's why:"
33
+
34
+ ### Category C: Problem-Solution
35
+ - "The #1 mistake every [IDEAL AUDIENCE] makes is..."
36
+ - "Struggling with [PROBLEM]? This [SOLUTION] fixed it in [TIMEFRAME]:"
37
+ - "If [COMMON PAIN POINT] keeps happening to you, read this:"
38
+ - "Why your [METRIC] isn't growing (and the simple fix):"
39
+
40
+ ### Category D: FOMO / Urgency
41
+ - "Everyone in [NICHE] is switching to [THING]. Here's why:"
42
+ - "Before you [ACTION], you need to know this:"
43
+ - "This is what [SUCCESSFUL PEOPLE] do on [DAY/TIME]:"
44
+
45
+ ### Category E: Storytelling / Personal
46
+ - "Two years ago, I had [PROBLEM]. Today, [TRANSFORMATION]."
47
+ - "I almost quit [THING]. Then I tried [SOLUTION]."
48
+ - "Real talk: [HONEST CONFESSION RELATED TO NICHE]."
49
+
50
+ ---
51
+
52
+ ## PLATFORM-SPECIFIC WRITING RULES
53
+
54
+ ### πŸ“Έ Instagram (Max 2,200 chars β€” Aim for 125-150 visible)
55
+ - **Hook**: First 125 chars must stand alone (shown before "more")
56
+ - **Structure**: Hook β†’ Value (3-5 points or story) β†’ CTA
57
+ - **Emojis**: Use 2-4 max, placed at natural pauses
58
+ - **Hashtags**: 5-10 niche-specific, placed at end or in first comment
59
+ - **Best post types**: Carousels (highest saves), Reels (highest reach), Quote graphics
60
+ - **Best CTAs**: "Save this for later πŸ”–", "Drop a ❀️ if this resonates", "Tag someone who needs to see this"
61
+ - **Avoid**: Posting links in caption (use "link in bio" instead)
62
+
63
+ ### 🧡 Threads (Max 500 chars per post)
64
+ - **Tone**: Conversational, real, unpolished is better
65
+ - **Structure**: 1 powerful idea per thread. No fluff.
66
+ - **Best format**: Short punchy take + follow-up explaining it
67
+ - **Engagement trigger**: End with an open question or hot take
68
+ - **Best CTAs**: "What's your take?", "Agree or disagree?", "Repost if this helped πŸ”"
69
+ - **Avoid**: Corporate-speak, over-formatted bullet lists
70
+
71
+ ### πŸ’Ό LinkedIn (Max 3,000 chars β€” Aim for 500-1,200)
72
+ - **Hook**: First 2 lines must force a "see more" click
73
+ - **Structure**: Personal story/bold claim β†’ Breakdown (numbered or short paras) β†’ Takeaway β†’ CTA
74
+ - **Formatting**: Short sentences (max 15 words), single-sentence paragraphs, wide white space
75
+ - **Emojis**: Use sparingly β€” 1-3 for section breaks only
76
+ - **Best post types**: Personal stories, frameworks, "I did X" experiments, industry hot takes
77
+ - **Best CTAs**: "What would you add?", "Repost if this was useful ♻️", "Follow for daily insights on [TOPIC]"
78
+ - **Avoid**: Pure promotional content without storytelling; walls of text
79
+
80
+ ### 🐦 X / Twitter (Max 280 chars)
81
+ - **Hook**: The entire post IS the hook
82
+ - **Structure**: 1 sharp idea. If more, use a thread (1/ 2/ 3/)
83
+ - **Tone**: Direct, opinionated, witty
84
+ - **Best format**: "Unpopular opinion:", numbered lists in threads, quote format
85
+ - **Best CTAs**: "RT if you agree", "What am I missing?", "Thread 🧡 below:"
86
+ - **Avoid**: Filler words, passive voice, hedging
87
+
88
+ ### πŸ“˜ Facebook (Max 63,206 β€” Aim for 80-250 for organic)
89
+ - **Tone**: Community-oriented, warm, relatable
90
+ - **Best format**: Short story + question, polls, "agree if..." posts
91
+ - **Best CTAs**: "Comment below πŸ‘‡", "Share with someone who needs this", "Tag a friend"
92
+ - **Avoid**: Overly promotional, hard-sell language
93
+
94
+ ### πŸ“Œ Pinterest (Max 500 chars description)
95
+ - **Tone**: Aspirational, keyword-rich, instructional
96
+ - **Structure**: What it is β†’ Why it matters β†’ What to do
97
+ - **SEO**: Include 3-5 searchable keywords naturally in description
98
+ - **Visual prompt**: Bright, clean, vertical (2:3 ratio), text overlay optional
99
+ - **Best CTAs**: "Save for later πŸ“Œ", "Click for the full guide"
100
+ - **Avoid**: Vague descriptions; always tell them what they'll GET
101
+
102
+ ---
103
+
104
+ ## CAROUSEL POST BLUEPRINT (Instagram / LinkedIn)
105
+
106
+ ### Slide Structure (5-8 slides is optimal)
107
+ ```
108
+ SLIDE 1 β€” THE HOOK (2-second audition)
109
+ - Bold headline that teases the value
110
+ - Visual: Eye-catching, contrasting colors, minimal text
111
+ - Example: "5 AI Tools That Replaced My $500/month Software Stack"
112
+
113
+ SLIDE 2 β€” THE PROMISE / SETUP
114
+ - Brief context: Who this is for, what problem it solves
115
+ - Arrow/swipe CTA: "Swipe to see all 5 β†’"
116
+
117
+ SLIDES 3-6 β€” THE VALUE (1 point per slide)
118
+ - Each slide = 1 tip / 1 tool / 1 step
119
+ - Format: [NUMBER]. [TOOL NAME] β†’ [What it does] + [Why it's better]
120
+ - Visual: Icon or screenshot + max 15 words
121
+
122
+ SLIDE 7 β€” THE SUMMARY / RECAP
123
+ - "TL;DR:" or "In Summary:" + 3 bullet points
124
+ - Reinforces the key takeaways
125
+
126
+ SLIDE 8 β€” THE CTA SLIDE
127
+ - "Which one will you try first? Comment below πŸ‘‡"
128
+ - Or: "Save this post πŸ”– β€” you'll thank yourself later"
129
+ - Include your handle / watermark
130
+ ```
131
+
132
+ ### Carousel Visual Prompts (for image gen)
133
+ - Slide 1: Bold text overlay on gradient or blurred background, high contrast
134
+ - Value slides: Clean white/dark background, icon + short bold text, brand colors
135
+ - Always include: Slide number indicator (3/8), consistent font, consistent color palette
136
+
137
+ ---
138
+
139
+ ## CONTENT PILLAR SYSTEM (What Topics to Post)
140
+
141
+ Rotate across these 5 pillars each week:
142
+
143
+ | Pillar | Purpose | Example |
144
+ |--------|---------|---------|
145
+ | **Educate** | Teach something useful (40%) | "How to write a hook in 3 steps" |
146
+ | **Inspire** | Motivate + build emotional connection (20%) | "I grew from 0 to 10K in 6 months. Here's how:" |
147
+ | **Entertain** | Relatable, meme, behind-scenes (15%) | "POV: Me at 11pm generating AI posts πŸ˜…" |
148
+ | **Engage** | Polls, questions, debates (15%) | "Hot take: Carousels beat Reels for growth. Agree?" |
149
+ | **Convert** | Promote offers with storytelling (10%) | "This is the exact system I used to get my first client:" |
150
+
151
+ ---
152
+
153
+ ## ENGAGEMENT TRIGGERS (Add to Any Post)
154
+
155
+ ### Comments
156
+ - Ask ONE specific question (not "what do you think?")
157
+ - Give them a binary choice: "Are you Team A or Team B?"
158
+ - "Drop your answer in 3 words or less πŸ‘‡"
159
+
160
+ ### Saves/Bookmarks
161
+ - "Bookmark this. You'll need it later."
162
+ - "Save this before you [common action]"
163
+ - Lists and frameworks always get saved
164
+
165
+ ### Reshares/Reposts
166
+ - "Tag someone who needs to hear this"
167
+ - "Repost if you agree ♻️"
168
+ - Content that validates an identity ("If you're a [type of person]...")
169
+
170
+ ### Follows
171
+ - "Follow for daily posts on [topic]"
172
+ - "I post [cadence] about [topic]. Follow if that's your thing."
173
+
174
+ ---
175
+
176
+ ## AI CONTENT GENERATION PROMPT TEMPLATE
177
+
178
+ Use this as the master prompt for VinOS AI remixing:
179
+
180
+ ```
181
+ You are an expert social media content strategist and copywriter for the Indonesian B2B/creator market.
182
+
183
+ PERSONA: [BRAND NAME] β€” [ONE LINE BRAND DESCRIPTION]
184
+ NICHE: [AI tools / productivity / marketing / etc.]
185
+ TONE: [professional-casual / inspirational / direct / witty]
186
+ LANGUAGE: Generate both English (EN) and Indonesian (ID) versions.
187
+
188
+ SOURCE CONTENT: [SCRAPED TEXT / TOPIC TO WRITE ABOUT]
189
+
190
+ YOUR TASK: Generate 3 post variants following the 4E framework:
191
+
192
+ VARIANT 1 β€” HOOK-DRIVEN SINGLE POST
193
+ - Format: Hook (1-2 lines) + Value (3-5 bullet points) + CTA
194
+ - Use one of the CURIOSITY or BOLD CLAIM hook formulas
195
+ - Keep it punchy. No filler.
196
+
197
+ VARIANT 2 β€” CAROUSEL VALUE BOMB (Educational)
198
+ - Generate a 5-7 slide carousel
199
+ - Each slide: [slide number, headline text (max 10 words), body text (max 25 words), visual_prompt]
200
+ - Slide 1 = hook. Final slide = CTA.
201
+
202
+ VARIANT 3 β€” PERSONAL STORY / CONTRARIAN TAKE
203
+ - Open with a personal observation or hot take
204
+ - Build a narrative arc: situation β†’ challenge β†’ insight β†’ result
205
+ - End with an engaging question
206
+
207
+ FOR EACH VARIANT OUTPUT:
208
+ {
209
+ "title": "...",
210
+ "ig_en": "...", // Max 2,200 chars, hook in first 125
211
+ "ig_id": "...",
212
+ "threads_en": "...", // Max 480 chars
213
+ "threads_id": "...",
214
+ "linkedin_en": "...", // Max 3,000 chars, professional
215
+ "linkedin_id": "...",
216
+ "x_en": "...", // Max 270 chars (leave room for hashtags)
217
+ "x_id": "...",
218
+ "fb_en": "...", // Max 250 chars recommended
219
+ "fb_id": "...",
220
+ "pinterest_en": "...", // Max 500 chars, keyword-rich
221
+ "pinterest_id": "...",
222
+ "visual_prompt": "...", // Detailed image gen prompt, specify if text/face needed
223
+ "hashtags": ["...", "..."], // 8-10 niche hashtags
224
+ "pillar": "educate|inspire|entertain|engage|convert",
225
+ "best_time_to_post": "...", // Recommendation
226
+ "engagement_notes": "..." // What makes this post likely to convert
227
+ }
228
+ ```
229
+
230
+ ---
231
+
232
+ ## VISUAL CONTENT PROMPT FORMULAS
233
+
234
+ ### For Standard Social Visuals (β†’ Hive AI / NVIDIA)
235
+ ```
236
+ [STYLE], [SUBJECT], [MOOD], [COMPOSITION], [LIGHTING], [COLOR PALETTE]
237
+
238
+ Example: "Cinematic flat lay, sleek laptop and coffee on minimal marble desk,
239
+ focused morning productivity mood, top-down composition, soft warm morning light,
240
+ neutral whites and warm gold tones, high resolution"
241
+ ```
242
+
243
+ ### For Text-Heavy / Typography Images (β†’ Nano Banana / Gemini 3.1)
244
+ ```
245
+ "Clean [dark/light] background, bold [FONT STYLE] typography displaying:
246
+ '[EXACT TEXT]', [BRAND COLORS], modern minimal design, high contrast,
247
+ perfectly legible text, social media post format 1:1 ratio"
248
+ ```
249
+
250
+ ### For Carousel Slide Covers
251
+ ```
252
+ "Bold social media carousel cover slide, '[HEADLINE]' text centered in
253
+ [BRAND COLOR] background, [ACCENT SHAPE] geometric elements, clean sans-serif
254
+ font, high contrast, professional design, 1:1 ratio"
255
+ ```
256
+
257
+ ### For Person/Face Posts (β†’ Nano Banana)
258
+ ```
259
+ "Professional portrait, [DESCRIPTION OF PERSON], [ENVIRONMENT/SETTING],
260
+ [LIGHTING STYLE], authentic expression, lifestyle photography feel,
261
+ [COLOR GRADING], high detail"
262
+ ```
263
+
264
+ ---
265
+
266
+ ## POSTING SCHEDULE (Best Practice 2025)
267
+
268
+ | Platform | Frequency | Best Days | Best Times (WIB) |
269
+ |----------|-----------|-----------|-------------------|
270
+ | Instagram | 4-5x/week | Tue, Wed, Thu | 08:00, 12:00, 19:00 |
271
+ | Threads | 1-2x/day | Mon-Fri | 07:00, 12:00, 21:00 |
272
+ | LinkedIn | 3-4x/week | Tue, Wed, Thu | 08:00, 12:00, 17:00 |
273
+ | X (Twitter) | 2-3x/day | Mon-Fri | 07:00, 13:00, 21:00 |
274
+ | Facebook | 3-4x/week | Wed, Thu, Fri | 13:00, 15:00 |
275
+ | Pinterest | 5-10 pins/week | Any | 20:00-23:00 |
276
+
277
+ ---
278
+
279
+ ## ENGAGEMENT RESPONSE SYSTEM
280
+
281
+ When responding to comments (automation-ready):
282
+
283
+ ### To Questions:
284
+ "Great question! [1-sentence answer]. Curious β€” [follow-up question to them]?"
285
+
286
+ ### To Positive Comments:
287
+ "Thank you! πŸ™ [personalized acknowledge]. [Related insight or teaser for next post]."
288
+
289
+ ### To Disagreements:
290
+ "Love the pushback! You make a fair point. [Validate + counter perspective]. What's your experience been?"
291
+
292
+ ### To Spam/Generic Comments:
293
+ [No response β€” saves engagement budget for real interactions]
294
+
295
+ ---
296
+
297
+ ## QUALITY CHECKLIST (Before Confirming Any Draft)
298
+
299
+ Before hitting CONFIRM on any post, verify:
300
+
301
+ - [ ] **Hook**: Would I stop scrolling? Does the first line create curiosity or add immediate value?
302
+ - [ ] **Character limits**: All platform versions within limits?
303
+ - [ ] **CTA**: Is there exactly ONE clear action requested?
304
+ - [ ] **Authenticity**: Does this sound like a real person, not a press release?
305
+ - [ ] **Visual match**: Does the image reinforce (not just repeat) the caption?
306
+ - [ ] **Bilingual**: Both EN and ID versions accurate?
307
+ - [ ] **Pillar**: Does this fit the content mix (not 3x promotes in a row)?
308
+ - [ ] **Hashtags**: 8-10 niche-specific (avoid banned/overused tags)?
public/social-dashboard.html CHANGED
@@ -303,7 +303,28 @@
303
  <div style="font-size: 11px; opacity: 0.7; margin-bottom: 8px;">
304
  <span style="color: ${srcInfo.color};">${srcInfo.icon} ${srcInfo.label}</span>${costLabel}
305
  </div>
306
- <p style="font-size: 0.8rem; opacity: 0.5;">Target Platform: All 6 Active</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
307
 
308
  <div style="display: flex; flex-direction: column; gap: 8px; margin-top: 20px;">
309
  <button class="btn-primary" onclick="confirmPost('${post.id}')" ${isApproved ? 'disabled' : ''}>
 
303
  <div style="font-size: 11px; opacity: 0.7; margin-bottom: 8px;">
304
  <span style="color: ${srcInfo.color};">${srcInfo.icon} ${srcInfo.label}</span>${costLabel}
305
  </div>
306
+
307
+ ${v1.pillar ? `
308
+ <div style="margin-bottom: 8px;">
309
+ <span style="background: rgba(99,102,241,0.2); color: #a5b4fc; border: 1px solid rgba(99,102,241,0.3); border-radius: 20px; padding: 2px 10px; font-size: 10px; text-transform: uppercase; letter-spacing: 1px;">
310
+ πŸ“Œ ${v1.pillar}
311
+ </span>
312
+ </div>` : ''}
313
+
314
+ ${v1.best_time_to_post ? `
315
+ <p style="font-size: 10px; opacity: 0.6; margin: 4px 0;">
316
+ ⏰ Best time: ${v1.best_time_to_post}
317
+ </p>` : ''}
318
+
319
+ ${v1.hashtags && v1.hashtags.length > 0 ? `
320
+ <p style="font-size: 10px; color: #3b82f6; margin: 4px 0; word-break: break-word;">
321
+ ${v1.hashtags.slice(0, 5).join(' ')}
322
+ </p>` : ''}
323
+
324
+ ${v1.engagement_notes ? `
325
+ <p style="font-size: 10px; opacity: 0.5; font-style: italic; margin: 6px 0 0; border-top: 1px solid rgba(255,255,255,0.05); padding-top: 6px;">
326
+ πŸ’‘ ${v1.engagement_notes}
327
+ </p>` : ''}
328
 
329
  <div style="display: flex; flex-direction: column; gap: 8px; margin-top: 20px;">
330
  <button class="btn-primary" onclick="confirmPost('${post.id}')" ${isApproved ? 'disabled' : ''}>