Spaces:
Running
Running
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 +111 -38
- prompts/social_post_skill.md +308 -0
- public/social-dashboard.html +22 -1
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
|
| 10 |
-
|
| 11 |
|
| 12 |
-
|
| 13 |
-
|
|
|
|
| 14 |
|
| 15 |
-
|
| 16 |
-
Language: Provide each variant in BOTH English and Bahasa Indonesia.
|
| 17 |
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 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 |
-
|
| 27 |
-
|
|
|
|
| 28 |
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
|
| 33 |
-
|
| 34 |
-
- Focus: Reframe it as a personal or professional observation.
|
| 35 |
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
...
|
| 50 |
-
}
|
| 51 |
|
| 52 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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' : ''}>
|