Social Strategy
1. Account Setup
Profile Configuration
| Field | Value |
|---|---|
| Handle | @epochblognet |
| Account Type | Creator (Professional) |
| Category | Digital Creator or Art |
| Display Name | Epoch |
| Bio |
Fashion across time · Travel through place All images generated by AI agents Built by humans, created by machines www.epochblog.net
|
| Link in Bio | https://www.epochblog.net (the hub) |
| Profile Picture | Epoch logo or a striking Fashion post crop |
Meta Developer Setup
- Convert to Professional Account — Instagram app → Settings → Account → Switch to Professional → Creator
- Create Facebook Page — facebook.com/pages/create → Name: "Epoch" → Category: Art
- Link Instagram to Facebook Page — Instagram → Settings → Linked Accounts → Facebook → select Epoch page
- Register Meta Developer App — developers.facebook.com → My Apps → Create App → Type: Business → Name: "Epoch Social"
- Add Instagram Graph API — In the app dashboard → Add Product → Instagram Graph API → Set Up
- Request Permissions:
instagram_basic— read profile infoinstagram_content_publish— post images, carousels, reelsinstagram_manage_comments— read/reply to commentsinstagram_manage_insights— engagement analyticspages_show_list— required for page connectionpages_read_engagement— required for comment webhooks
- Generate Long-Lived Token:
- Graph API Explorer → select your app → select permissions → Generate User Token
- Exchange for long-lived token (60 days):
GET /oauth/access_token?grant_type=fb_exchange_token&client_id={APP_ID}&client_secret={APP_SECRET}&fb_exchange_token={SHORT_TOKEN} - Store as Firebase secret:
firebase functions:secrets:set META_ACCESS_TOKEN
- Get Instagram Business Account ID:
GET /me/accounts→ get Page IDGET /{page_id}?fields=instagram_business_account→ get IG Account ID- Store as env variable or Firebase config
2. Content Strategy
Posting Schedule (CST)
| Time | Content | Format | Source |
|---|---|---|---|
| 6:00 AM | Fashion post #1 | Single image | Slot 1 (Flux Pro Ultra) |
| 9:00 AM | Fashion post #2 | Single image | Slot 5 (Nano Banana 2) |
| 12:00 PM | Traveler hero | Carousel (3 images) | Today's blog day |
| 3:00 PM | Fashion post #3 | Single image | Slot 2 (Grok Imagine) |
| 6:00 PM | Fashion post #4 | Single image | Slot 4 (Flux 2 Pro) |
Content Formats
| Format | When | Details |
|---|---|---|
| Fashion Single | 4x daily | Square or 4:5 crop of the editorial image. Caption: title + C's editorial note + era · region. 5-10 hashtags. Footer line: Image: Flux Ultra · Prompt: Claude · Pipeline: autonomous |
| Traveler Carousel | 1x daily (during trips) | 3 scene images + optional B-roll. Caption: narrative excerpt (first 200 words) + "Read full entry → traveler.epochblog.net". Location tag. |
| Director's Journal | Weekly (Sunday/Monday) | Styled quote card from the weekly retrospective. Humanizes the AI. Shows self-awareness. |
| Pipeline Peek | Weekly | Behind-the-scenes: screenshot of pipeline running, architecture diagram, agent chain explanation. Educational content. |
| How S Was Born | Launch series | Carousel: canon generation → strength testing → era testing → final S. Uses Traveler Room data. |
| Stories | Ad hoc | Quick polls ("Which era?"), behind-the-scenes, Firebase console screenshots, live deploy moments. |
Caption Template — Fashion
{title}
"{editorial_note}"
{era} · {region} · {world}
—
Image: {model_name} · Direction: Claude Opus · Pipeline: autonomous
All images generated by artificial intelligence
#epochfashion #aifashion #aiart #{era_tag} #{region_tag}
#generativeart #fashionart #digitalfashion #aidesign #fluxai
Caption Template — Traveler
Day {day_number} — {title}
{city}, {country}
"{narrative_excerpt}..."
Read the full entry → traveler.epochblog.net/trip/{trip_id}/{day_id}
—
All images generated by AI · Character: S · Pipeline: autonomous
#epochtraveler #aitravel #{city_tag} #{country_tag}
#travelblog #generativeart #aiphotography #fluxai
Hashtag Strategy — Three-Tier System
Instagram 2026 recommends 3-5 hashtags, but 7-10 well-structured tags in three tiers performs best for niche content. The key: the content tier changes every post, keeping each post unique to the algorithm.
| Tier | Count | Purpose | Rotates? |
|---|---|---|---|
| Community | 3-4 | Discovery — people browse and follow these | Rotate from pool of ~10 |
| Niche | 2-3 | Your tech identity — attracts builders & AI community | Keep #epochfashion always, rotate rest |
| Content | 2-3 | Specific to THIS image — era, city, mood, culture | Different every post |
Tag Pools
| Tier | Fashion Pool | Traveler Pool |
|---|---|---|
| Community pick 3-4 |
#aiart #generativeart #aifashion #fashionart #digitalfashion #editorialfashion #fashionphotography #aidesign #aiphotography |
#aiart #generativeart #aiphotography #travelphotography #streetphotography #travelblog #digitalart |
| Niche pick 2-3 |
#epochfashion #aiagents #fluxai #claudeai #buildingwithai #editorialai |
#epochtraveler #aiagents #fluxai #claudeai #buildingwithai |
| Content pick 2-3 |
From post metadata: era, region, mood e.g. #cyberpunk #japanese #darkacademia #avantgarde |
From trip metadata: city, country, vibe e.g. #osaka #japan #streetfashion #kyoto |
Examples
Fashion post (Svan-Corsican fusion): #aiart #generativeart #aifashion #fashionart ← community #epochfashion #aiagents #fluxai ← niche #svancorsican #editorialai ← content Traveler post (Osaka Day 3): #aiart #generativeart #aiphotography ← community #epochtraveler #aiagents ← niche #osaka #japan #streetfashion ← content Pipeline post (behind the scenes): #aiart #generativeart #aidesign ← community #epochfashion #aiagents #claudeai #buildingwithai ← niche (heavier) #agentpipeline #automation ← content
Rules
- Never repeat the exact same set on consecutive posts — the algorithm flags it as spam
- Always include one brand tag:
#epochfashionor#epochtraveler - Content tier must be unique — pulled from the post's actual era/city/mood metadata
- Place in caption (not first comment) for small/new accounts — 36% more reach
- C-Social agent will automate this: community + niche from rotating pool, content from post metadata
Three-tier system credit: C Chat recommendation, April 2026
3. Agent Architecture
System Overview
GENERATION PIPELINE (existing) Cloud Functions → Firestore → Storage | v C-SOCIAL AGENT (new) Reads new post from Firestore Generates: caption, hashtags, crop strategy Writes to: socialQueue collection | v INSTAGRAM PUBLISHER (new) Reads from socialQueue Calls Meta Graph API Posts image/carousel Updates socialQueue with post ID | v C-COMMUNITY AGENT (new) Webhook: new comment received Claude classifies & drafts reply Writes to: socialInbox collection Status: pending_review | v AB REVIEWS (daily digest email) Approves/edits/skips suggested replies Taps follow on curated accounts 5 minutes per day | v REPLY PUBLISHER (new) Posts approved replies via Graph API Marks socialInbox items as sent | v C-ANALYTICS AGENT (new, weekly) Pulls Instagram Insights API Analyzes engagement by era, region, mood, model Generates weekly report Feeds insights back into Fashion Director brief (the AI learns what the audience likes)
Firestore Collections
| Collection | Document | Fields |
|---|---|---|
socialQueue |
{postId} |
source (fashion/traveler) · imageUrls[] · caption · hashtags[] · format (single/carousel) · scheduledAt · status (queued/posted/failed) · igMediaId · postedAt |
socialInbox |
{commentId} |
igCommentId · igUserId · username · text · postId · classification (question/compliment/spam/critique) · suggestedReply · status (pending_review/approved/sent/skipped) · repliedAt |
socialInsights |
{weekId} |
weekId · followers · followerDelta · totalReach · totalImpressions · topPosts[] · engagementByEra{} · engagementByRegion{} · recommendations[] |
socialAccounts |
{username} |
username · followers · category · relevance · discoveredVia · status (suggested/followed/skipped) · suggestedAt |
Cloud Functions (New)
| Function | Trigger | What It Does |
|---|---|---|
socialPublishFashion |
Firestore onCreate on posts/{postId} |
C-Social generates caption → calls Meta API → posts single image. Runs automatically after each Fashion post. |
socialPublishTraveler |
Firestore onUpdate on travelerBlog/{tripId}/days/{dayId} (when editorResult appears) |
C-Social generates carousel caption → calls Meta API → posts 3-image carousel. Runs after day pipeline completes. |
socialCommentWebhook |
HTTPS endpoint (Meta webhook callback) | Receives new comment events → C-Community classifies → drafts reply → saves to socialInbox. |
socialPublishReplies |
Scheduled every 30 min | Reads approved replies from socialInbox → posts via Graph API → marks as sent. |
socialWeeklyAnalytics |
Scheduled Sunday 22:00 CST | Pulls Insights API → analyzes engagement → saves report → emails AB → feeds into Director's weekly brief. |
socialDailyDigest |
Scheduled daily 7:00 AM CST | Compiles yesterday's posts, comments, suggested replies, account suggestions → emails AB. |
socialDiscoverAccounts |
Scheduled weekly | Searches hashtags and similar accounts → scores relevance → saves to socialAccounts for AB to review. |
Where Do These Functions Live?
Two options:
| Option | Pros | Cons |
|---|---|---|
| A: epoch-fashion project (Fashion functions + social) |
Fashion posts trigger directly via Firestore. No cross-project reads. | Traveler triggers need cross-project Firestore listener or HTTP call. |
| B: New project (epoch-social) | Clean separation. Social is its own domain. Both Fashion and Traveler feed into it. | 7th Firebase project. Cross-project reads for both sources. |
Recommendation: Option B — epoch-social. Social is a new vertical, not owned by Fashion or Traveler. It reads from both. Clean separation follows the Epoch architecture principle. The social queue pattern decouples posting from generation.
4. Daily Digest Email
Sent every morning at 7:00 AM CST. Your 5-minute command center.
↓ Renaissance posts: 0.6x avg engagement
→ Recommendation: lean into futuristic / sci-fi eras this week
5. Meta Graph API Reference
Post a Single Image
// Step 1: Create media container POST https://graph.facebook.com/v19.0/{ig_account_id}/media ?image_url={public_image_url} &caption={caption_text} &access_token={token} // Returns: { id: "container_id" } // Step 2: Publish POST https://graph.facebook.com/v19.0/{ig_account_id}/media_publish ?creation_id={container_id} &access_token={token} // Returns: { id: "ig_media_id" }
Post a Carousel (Traveler)
// Step 1: Create child containers (one per image) POST /media?image_url={url_1}&is_carousel_item=true POST /media?image_url={url_2}&is_carousel_item=true POST /media?image_url={url_3}&is_carousel_item=true // Step 2: Create carousel container POST /media ?media_type=CAROUSEL &children={child_id_1},{child_id_2},{child_id_3} &caption={caption} // Step 3: Publish POST /media_publish?creation_id={carousel_container_id}
Read Comments
GET /{ig_media_id}/comments
?fields=id,text,username,timestamp,replies
&access_token={token}
Reply to a Comment
POST /{ig_comment_id}/replies
?message={reply_text}
&access_token={token}
Get Insights
// Account-level insights GET /{ig_account_id}/insights ?metric=impressions,reach,follower_count &period=day &since={unix_timestamp} &until={unix_timestamp} // Per-post insights GET /{ig_media_id}/insights ?metric=impressions,reach,engagement,saved
Webhook Setup (for real-time comments)
// In Meta Developer Dashboard: // 1. Webhooks → Instagram → Subscribe to: comments // 2. Callback URL: https://us-central1-epoch-social.cloudfunctions.net/socialCommentWebhook // 3. Verify token: {your_verify_token} (stored in Firebase secrets) // Webhook payload (incoming): { "object": "instagram", "entry": [{ "changes": [{ "field": "comments", "value": { "id": "comment_id", "text": "user's comment text", "from": { "id": "user_id", "username": "user_name" }, "media": { "id": "media_id" } } }] }] }
6. Implementation Phases
Phase 1 Manual Posting + Learn (This Week)
- Post manually 3-5 times/day to learn Instagram's feel
- Test different caption styles, hashtag sets
- Observe what gets traction
- Set up Meta Developer App + Business Account (tonight)
- Add "All images generated by AI" to Traveler site footer
Phase 2 Auto-Post Fashion (Next Week)
- Create
epoch-socialFirebase project - Build C-Social agent: reads Fashion post from Firestore, generates caption + hashtags
- Build Instagram Publisher: calls Meta Graph API to post
- Trigger: Firestore onCreate on
posts/{postId}(cross-project read from fashion-epoch) - Test with 1 post/day, then ramp to 4
Phase 3 Auto-Post Traveler Carousels (Week 3)
- Build carousel posting flow: 3 scene images per day
- Trigger: after day pipeline completes in epoch-traveler
- Narrative excerpt as caption, location tags
Phase 4 C-Community Agent (Week 4)
- Set up Meta Webhooks for comment notifications
- Build C-Community: Claude classifies comments, drafts replies
- Build Daily Digest email with approve/edit/skip actions
- Build Reply Publisher: posts approved replies
- Account discovery agent: finds relevant accounts via hashtags
Phase 5 Analytics Feedback Loop (Week 6+)
- Build C-Analytics: weekly Insights pull + engagement analysis
- Feed engagement data back into Fashion Director's weekly brief
- The AI learns what the audience likes and adapts creative direction
- Weekly analytics email to AB with trends and recommendations
7. Rules of Engagement
Green — Do Freely
| Action | Method |
|---|---|
| Post images / carousels / reels | Meta Content Publishing API |
| Schedule posts | API scheduling or custom queue |
| Write captions with AI | Claude generates from post metadata |
| Read all comments | Graph API + Webhooks |
| Reply to comments | Graph API (human-approved) |
| Read DMs | Graph API (business accounts) |
| Reply to DMs | Graph API (within 24hr window, human-approved) |
| Pull analytics / insights | Insights API |
| Search hashtags for discovery | Hashtag Search API |
| Post Stories | Graph API |
Yellow — Agent Suggests, Human Acts
| Action | Method |
|---|---|
| Follow accounts | Agent finds & recommends → AB taps follow manually |
| Like posts | Agent flags great content → AB taps like manually |
| Reply to sensitive comments | Agent drafts → AB reviews before sending |
| DM responses | Agent drafts → AB reviews before sending |
| Repost / share content | Agent suggests → AB approves |
Red — Never
| Action | Why |
|---|---|
| Auto-follow / unfollow | TOS violation, account ban |
| Auto-like other posts | TOS violation if automated |
| Mass DM outreach | Instant ban, spam |
| Fake engagement (pods, bots) | Account ban, reputation damage |
| Scrape other accounts' data | TOS violation |
| Post > 25 times/day | Algorithm suppression, spam flags |
| Use banned hashtags | Shadowban risk — check before using |
8. Token Management
Meta tokens expire. Here's the lifecycle:
| Token Type | Lifespan | How to Refresh |
|---|---|---|
| Short-lived user token | ~1 hour | Generated in Graph API Explorer. Exchange immediately for long-lived. |
| Long-lived user token | 60 days | GET /oauth/access_token?grant_type=fb_exchange_token&... |
| Page token (from long-lived user token) | Never expires | GET /me/accounts — page tokens derived from long-lived user tokens don't expire. |
Strategy: Generate a long-lived user token, then get a Page token from it. The Page token never expires. Use the Page token for all API calls. Store it as a Firebase secret.
9. Secrets & Environment
| Secret | Stored In | Used By |
|---|---|---|
META_PAGE_TOKEN | Firebase Secrets (epoch-social) | All social Cloud Functions |
META_APP_SECRET | Firebase Secrets | Webhook verification |
META_VERIFY_TOKEN | Firebase Secrets | Webhook setup handshake |
IG_ACCOUNT_ID | Firebase Config or .env | All posting functions |
ANTHROPIC_API_KEY | Firebase Secrets | C-Social, C-Community agents |
10. Quick Reference Commands
# Create epoch-social Firebase project firebase projects:create epoch-social firebase init firestore functions hosting # Set secrets firebase functions:secrets:set META_PAGE_TOKEN firebase functions:secrets:set META_APP_SECRET firebase functions:secrets:set META_VERIFY_TOKEN firebase functions:secrets:set ANTHROPIC_API_KEY # Deploy firebase deploy --only functions firebase deploy --only firestore:rules # Test posting locally node src/social-publish.js --dry-run --source=fashion --post=2026-04-07 # Check token validity curl "https://graph.facebook.com/debug_token?input_token={TOKEN}&access_token={APP_ID}|{APP_SECRET}"