@growthub/cli 0.3.53 → 0.3.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/worker-kits/growthub-ai-website-cloner-v1/.env.example +7 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/QUICKSTART.md +116 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/brands/NEW-CLIENT.md +22 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/brands/_template/brand-kit.md +27 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/brands/growthub/brand-kit.md +26 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/bundles/growthub-ai-website-cloner-v1.json +53 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/docs/ai-website-cloner-fork-integration.md +118 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/docs/design-token-system.md +135 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/docs/multi-phase-pipeline.md +129 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/docs/parallel-builder-dispatch.md +103 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/examples/clone-brief-sample.md +54 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/examples/component-spec-sample.md +123 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/examples/platform-handoff-sample.md +102 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/examples/visual-qa-sample.md +119 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/growthub-meta/README.md +71 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/growthub-meta/kit-standard.md +47 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/kit.json +105 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/output/README.md +26 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/output-standards.md +75 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/runtime-assumptions.md +70 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/setup/check-deps.sh +50 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/setup/clone-fork.sh +66 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/setup/verify-env.mjs +78 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/skills.md +186 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/asset-manifest.md +57 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/builder-dispatch-plan.md +92 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/clone-brief.md +59 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/component-spec.md +124 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/design-token-extraction.md +89 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/platform-handoff.md +114 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/reconnaissance-report.md +77 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/visual-qa-checklist.md +107 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/validation-checklist.md +76 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/workers/ai-website-cloner-operator/CLAUDE.md +256 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/.env.example +40 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/QUICKSTART.md +114 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/brands/NEW-CLIENT.md +42 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/brands/_template/brand-kit.md +49 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/brands/growthub/brand-kit.md +50 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/bundles/growthub-open-montage-studio-v1.json +55 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/docs/cms-node-bridge.md +152 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/docs/open-montage-fork-integration.md +120 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/docs/pipeline-reference.md +147 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/docs/provider-adapter-layer.md +105 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/examples/cms-node-video-gen-sample.md +109 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/examples/pipeline-selection-sample.md +67 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/examples/platform-ready-handoff-sample.md +101 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/examples/video-production-brief-sample.md +68 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/growthub-meta/README.md +7 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/growthub-meta/kit-standard.md +45 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/kit.json +107 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/output/README.md +34 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/output-standards.md +79 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/runtime-assumptions.md +86 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/setup/check-deps.sh +43 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/setup/clone-fork.sh +53 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/setup/verify-env.mjs +102 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/skills.md +254 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/asset-tracking.md +46 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/cms-node-pipeline-mapping.md +64 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/generation-batch-plan.md +70 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/pipeline-selection-brief.md +67 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/platform-ready-execution-handoff.md +103 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/prompt-matrix.md +48 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/provider-selection-brief.md +86 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/review-qa-checklist.md +59 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/scene-plan.md +65 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/video-production-brief.md +58 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/validation-checklist.md +46 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/workers/open-montage-studio-operator/CLAUDE.md +304 -0
- package/assets/worker-kits/growthub-postiz-social-v1/.env.example +18 -0
- package/assets/worker-kits/growthub-postiz-social-v1/QUICKSTART.md +136 -0
- package/assets/worker-kits/growthub-postiz-social-v1/brands/NEW-CLIENT.md +67 -0
- package/assets/worker-kits/growthub-postiz-social-v1/brands/_template/brand-kit.md +120 -0
- package/assets/worker-kits/growthub-postiz-social-v1/brands/growthub/brand-kit.md +117 -0
- package/assets/worker-kits/growthub-postiz-social-v1/bundles/growthub-postiz-social-v1.json +52 -0
- package/assets/worker-kits/growthub-postiz-social-v1/docs/ai-caption-layer.md +118 -0
- package/assets/worker-kits/growthub-postiz-social-v1/docs/bullmq-queue-layer.md +157 -0
- package/assets/worker-kits/growthub-postiz-social-v1/docs/platform-coverage.md +97 -0
- package/assets/worker-kits/growthub-postiz-social-v1/docs/postiz-fork-integration.md +143 -0
- package/assets/worker-kits/growthub-postiz-social-v1/examples/analytics-brief-sample.md +125 -0
- package/assets/worker-kits/growthub-postiz-social-v1/examples/client-proposal-sample.md +127 -0
- package/assets/worker-kits/growthub-postiz-social-v1/examples/content-calendar-sample.md +75 -0
- package/assets/worker-kits/growthub-postiz-social-v1/examples/social-campaign-sample.md +104 -0
- package/assets/worker-kits/growthub-postiz-social-v1/growthub-meta/README.md +128 -0
- package/assets/worker-kits/growthub-postiz-social-v1/growthub-meta/kit-standard.md +113 -0
- package/assets/worker-kits/growthub-postiz-social-v1/kit.json +104 -0
- package/assets/worker-kits/growthub-postiz-social-v1/output/README.md +56 -0
- package/assets/worker-kits/growthub-postiz-social-v1/output-standards.md +127 -0
- package/assets/worker-kits/growthub-postiz-social-v1/runtime-assumptions.md +159 -0
- package/assets/worker-kits/growthub-postiz-social-v1/setup/check-deps.sh +117 -0
- package/assets/worker-kits/growthub-postiz-social-v1/setup/clone-fork.sh +83 -0
- package/assets/worker-kits/growthub-postiz-social-v1/setup/verify-env.mjs +99 -0
- package/assets/worker-kits/growthub-postiz-social-v1/skills.md +277 -0
- package/assets/worker-kits/growthub-postiz-social-v1/templates/analytics-brief.md +123 -0
- package/assets/worker-kits/growthub-postiz-social-v1/templates/caption-copy-deck.md +127 -0
- package/assets/worker-kits/growthub-postiz-social-v1/templates/client-proposal.md +139 -0
- package/assets/worker-kits/growthub-postiz-social-v1/templates/content-calendar.md +65 -0
- package/assets/worker-kits/growthub-postiz-social-v1/templates/platform-publishing-plan.md +112 -0
- package/assets/worker-kits/growthub-postiz-social-v1/templates/scheduling-manifest.md +83 -0
- package/assets/worker-kits/growthub-postiz-social-v1/templates/social-campaign-brief.md +111 -0
- package/assets/worker-kits/growthub-postiz-social-v1/validation-checklist.md +79 -0
- package/assets/worker-kits/growthub-postiz-social-v1/workers/postiz-social-operator/CLAUDE.md +287 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/.env.example +15 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/QUICKSTART.md +90 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/brands/NEW-CLIENT.md +57 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/brands/_template/brand-kit.md +88 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/brands/growthub/brand-kit.md +92 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/bundles/growthub-twenty-crm-v1.json +56 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/docs/api-and-webhooks.md +296 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/docs/data-model-layer.md +172 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/docs/twenty-fork-integration.md +213 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/examples/crm-playbook-sample.md +172 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/examples/crm-setup-sample.md +100 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/examples/lead-enrichment-sample.md +117 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/examples/pipeline-automation-sample.md +132 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/growthub-meta/README.md +114 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/growthub-meta/kit-standard.md +61 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/kit.json +108 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/output/README.md +46 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/output-standards.md +175 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/runtime-assumptions.md +150 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/setup/check-deps.sh +56 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/setup/clone-fork.sh +77 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/setup/verify-env.mjs +105 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/skills.md +401 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/api-query-plan.md +179 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/crm-playbook.md +155 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/crm-setup-brief.md +94 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/custom-object-design.md +115 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/data-model-design.md +112 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/enrichment-field-map.md +100 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/import-mapping.md +139 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/integration-handoff.md +190 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/lead-enrichment-pipeline.md +128 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/pipeline-automation-brief.md +88 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/webhook-integration-spec.md +129 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/workspace-config-checklist.md +129 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/validation-checklist.md +115 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/workers/twenty-crm-operator/CLAUDE.md +310 -0
- package/package.json +1 -1
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Brand Kit — Growthub
|
|
2
|
+
|
|
3
|
+
<!-- Reference example for the Postiz Social Media Studio. Use this to understand the expected format and detail level. -->
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Client Identity
|
|
8
|
+
|
|
9
|
+
| Field | Value |
|
|
10
|
+
|---|---|
|
|
11
|
+
| Client Name | Growthub |
|
|
12
|
+
| Client Slug | `growthub` |
|
|
13
|
+
| Industry | Developer tools / AI agent infrastructure / SaaS |
|
|
14
|
+
| Website | https://growthub.ai |
|
|
15
|
+
| Primary Contact | Internal — Growthub marketing team |
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Social Media Presence
|
|
20
|
+
|
|
21
|
+
| Platform | Handle | Followers | Current Status |
|
|
22
|
+
|---|---|---|---|
|
|
23
|
+
| X/Twitter | @growthubai | 3,200 | Active |
|
|
24
|
+
| LinkedIn | Growthub (company page) | 1,800 | Active |
|
|
25
|
+
| Bluesky | @growthub.ai | 400 | Growing |
|
|
26
|
+
| GitHub | github.com/Growthub-ai | 2,100 stars | Active (open source) |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Target Audience
|
|
31
|
+
|
|
32
|
+
### Primary Audience
|
|
33
|
+
|
|
34
|
+
| Attribute | Description |
|
|
35
|
+
|---|---|
|
|
36
|
+
| Age Range | 25–45 |
|
|
37
|
+
| Gender | 60% male, 40% female |
|
|
38
|
+
| Location | North America, Europe, English-speaking global |
|
|
39
|
+
| Interests | AI agents, developer tools, automation, indie hacking, SaaS growth |
|
|
40
|
+
| Pain Points | Complex agent orchestration, lack of open-source local-first alternatives, AI tool fatigue |
|
|
41
|
+
| Content Preferences | Technical tutorials, tool comparisons, workflow examples, behind-the-scenes product builds |
|
|
42
|
+
|
|
43
|
+
### Secondary Audience
|
|
44
|
+
|
|
45
|
+
| Attribute | Description |
|
|
46
|
+
|---|---|
|
|
47
|
+
| Age Range | 18–25 |
|
|
48
|
+
| Interests | Open source, hackathons, learning AI development |
|
|
49
|
+
| Platform | GitHub, X/Twitter, Bluesky |
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Campaign Objectives
|
|
54
|
+
|
|
55
|
+
| Objective | Metric | Target | Timeline |
|
|
56
|
+
|---|---|---|---|
|
|
57
|
+
| Developer awareness | GitHub stars | +500/quarter | Q2 2026 |
|
|
58
|
+
| Community growth | Twitter/X followers | +200/month | Ongoing |
|
|
59
|
+
| Thought leadership | LinkedIn impressions | 20,000/month | Q2 2026 |
|
|
60
|
+
| Open-source adoption | CLI downloads | +1,000/month | Q2 2026 |
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Brand Voice
|
|
65
|
+
|
|
66
|
+
| Attribute | Spec |
|
|
67
|
+
|---|---|
|
|
68
|
+
| Tone | Direct, technically credible, approachable. We explain without condescending. We ship without bragging. |
|
|
69
|
+
| Personality | Builder-first. We're in the trenches using the tools we build. |
|
|
70
|
+
| Words to Use | "build", "ship", "run", "local", "open", "agent", "workflow", "kit", "workspace" |
|
|
71
|
+
| Words to Avoid | "disruptive", "AI-powered" (use "agent-native" instead), "revolutionary", "hack" |
|
|
72
|
+
| Emoji Usage | Minimal — 0–1 on LinkedIn; 0–2 on X; 2–4 on Instagram |
|
|
73
|
+
| CTA Style | Action verbs with immediate value: "Try it now", "Clone and run", "Read the docs", "Star on GitHub" |
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Content Theme Pillars
|
|
78
|
+
|
|
79
|
+
| Pillar | Description | Platforms | % of Calendar |
|
|
80
|
+
|---|---|---|---|
|
|
81
|
+
| Product Builds | Behind-the-scenes of building Growthub features — architecture, decisions, tradeoffs | X, LinkedIn, GitHub | 35% |
|
|
82
|
+
| Developer Tutorials | How to use Growthub kits, commands, and workflows in real workflows | X, LinkedIn, Bluesky | 30% |
|
|
83
|
+
| Open Source | Open-source culture, contributions, partner project spotlights | X, Bluesky, GitHub | 20% |
|
|
84
|
+
| Community | User projects, shoutouts, Q&A, polls | X, LinkedIn | 15% |
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Competitor Reference Accounts
|
|
89
|
+
|
|
90
|
+
| Platform | Account | Why Reference |
|
|
91
|
+
|---|---|---|
|
|
92
|
+
| X/Twitter | @langchain | Strong developer community engagement, technical thread format |
|
|
93
|
+
| LinkedIn | Anthropic company page | Consistent educational posting, thought leadership |
|
|
94
|
+
| X/Twitter | @cursor_ai | Product-led content strategy, community responsiveness |
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Agency Context
|
|
99
|
+
|
|
100
|
+
| Field | Value |
|
|
101
|
+
|---|---|
|
|
102
|
+
| Engagement Stage | Internal — first-party reference kit |
|
|
103
|
+
| Monthly Retainer | N/A (internal) |
|
|
104
|
+
| Campaign Budget | N/A |
|
|
105
|
+
| Reporting Cadence | Monthly analytics brief to marketing team |
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## CRM Notes
|
|
110
|
+
|
|
111
|
+
Internal reference account. Used to demonstrate the kit's brand kit format and example output quality. Not a live client account.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## DELIVERABLES LOG
|
|
116
|
+
|
|
117
|
+
<!-- - YYYY-MM-DD | Social Media Campaign Package v1 — Growthub Q2 2026 Launch | output/growthub/q2-2026-launch/ -->
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 2,
|
|
3
|
+
"bundle": {
|
|
4
|
+
"id": "growthub-postiz-social-v1",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"kitId": "growthub-postiz-social-v1",
|
|
7
|
+
"workerId": "postiz-social-operator"
|
|
8
|
+
},
|
|
9
|
+
"briefType": "postiz-social-media-campaign",
|
|
10
|
+
"publicExampleBrandPaths": [
|
|
11
|
+
"brands/growthub/brand-kit.md"
|
|
12
|
+
],
|
|
13
|
+
"requiredFrozenAssets": [
|
|
14
|
+
"QUICKSTART.md",
|
|
15
|
+
".env.example",
|
|
16
|
+
"skills.md",
|
|
17
|
+
"output-standards.md",
|
|
18
|
+
"runtime-assumptions.md",
|
|
19
|
+
"validation-checklist.md",
|
|
20
|
+
"workers/postiz-social-operator/CLAUDE.md",
|
|
21
|
+
"brands/_template/brand-kit.md",
|
|
22
|
+
"brands/growthub/brand-kit.md",
|
|
23
|
+
"brands/NEW-CLIENT.md",
|
|
24
|
+
"setup/clone-fork.sh",
|
|
25
|
+
"setup/verify-env.mjs",
|
|
26
|
+
"setup/check-deps.sh",
|
|
27
|
+
"output/README.md",
|
|
28
|
+
"templates/social-campaign-brief.md",
|
|
29
|
+
"templates/content-calendar.md",
|
|
30
|
+
"templates/platform-publishing-plan.md",
|
|
31
|
+
"templates/caption-copy-deck.md",
|
|
32
|
+
"templates/analytics-brief.md",
|
|
33
|
+
"templates/scheduling-manifest.md",
|
|
34
|
+
"templates/client-proposal.md",
|
|
35
|
+
"examples/social-campaign-sample.md",
|
|
36
|
+
"examples/content-calendar-sample.md",
|
|
37
|
+
"examples/analytics-brief-sample.md",
|
|
38
|
+
"examples/client-proposal-sample.md",
|
|
39
|
+
"docs/postiz-fork-integration.md",
|
|
40
|
+
"docs/platform-coverage.md",
|
|
41
|
+
"docs/ai-caption-layer.md",
|
|
42
|
+
"docs/bullmq-queue-layer.md",
|
|
43
|
+
"growthub-meta/README.md",
|
|
44
|
+
"growthub-meta/kit-standard.md"
|
|
45
|
+
],
|
|
46
|
+
"optionalPresets": [],
|
|
47
|
+
"export": {
|
|
48
|
+
"folderName": "growthub-agent-worker-kit-postiz-social-v1",
|
|
49
|
+
"zipFileName": "growthub-agent-worker-kit-postiz-social-v1.zip"
|
|
50
|
+
},
|
|
51
|
+
"activationModes": ["export"]
|
|
52
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# AI Caption Layer
|
|
2
|
+
|
|
3
|
+
**Methodology for AI-assisted caption generation in the Postiz Social Media Operator.**
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
The AI caption layer produces A/B/C caption variants for every post in the content calendar. This document defines the tone profiles, variant construction rules, and quality bar applied to every caption draft.
|
|
10
|
+
|
|
11
|
+
The agent generates captions using:
|
|
12
|
+
1. The brand kit's voice guidelines (`brands/<client-slug>/brand-kit.md`)
|
|
13
|
+
2. The platform tone profiles defined in this document
|
|
14
|
+
3. The theme pillar context from the Social Campaign Brief
|
|
15
|
+
4. The character limits and hashtag rules from `docs/platform-coverage.md`
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Platform Tone Profiles
|
|
20
|
+
|
|
21
|
+
| Platform | Tone | Voice | Avoid |
|
|
22
|
+
|---|---|---|---|
|
|
23
|
+
| Instagram | Visual-first, aspirational, authentic | First-person POV, sensory language, short punchy sentences | Corporate jargon, excessive hashtags, stock-photo clichés |
|
|
24
|
+
| LinkedIn | Professional, insight-driven, confident | Data-backed claims, industry terminology, no jargon | Salesy language, superlatives without proof, informal slang |
|
|
25
|
+
| TikTok | Casual, trend-aware, energetic, hook-first | Gen Z cadence, pattern interrupt, hook in first 2 words | Formal tone, long sentences, no emoji, corporate speak |
|
|
26
|
+
| X/Twitter | Concise, punchy, opinionated | Declarative sentences, take-first, thread-opening hooks | Wishy-washy hedging, long-winded intros, excessive hashtags |
|
|
27
|
+
| Pinterest | Aspirational, instructional, keyword-rich | Descriptive, actionable verbs, lifestyle context | Vague descriptions, missing context, non-searchable language |
|
|
28
|
+
| Facebook | Conversational, community-first, warm | Inclusive "we/our", questions, local/personal context | Overly promotional, algorithm-bait language |
|
|
29
|
+
| Bluesky | Direct, open-web-aware, intellectual | Concise, tech-savvy, first-principles reasoning | Overly polished PR-speak, platform-specific references |
|
|
30
|
+
| Mastodon | Community-focused, inclusive, decentralization-aware | Plain language, CamelCase hashtags for accessibility | Algorithmic optimization language, commercial urgency |
|
|
31
|
+
| Reddit | Authentic, community-native, contribution-first | Reddit idioms where appropriate, value-first, no self-promotion optics | Obvious promotional tone, link dumps without context |
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Variant Construction Rules
|
|
36
|
+
|
|
37
|
+
### Variant A — Direct / Factual
|
|
38
|
+
|
|
39
|
+
- Lead with the core fact, data point, or product statement
|
|
40
|
+
- Second sentence: supporting evidence or context
|
|
41
|
+
- Third sentence (if length allows): CTA
|
|
42
|
+
- Tone: confident, no hedging language
|
|
43
|
+
- Use numbers when available: "78% of marketers say..." outperforms "many marketers say..."
|
|
44
|
+
|
|
45
|
+
**Structure template:**
|
|
46
|
+
```
|
|
47
|
+
[Core claim or insight.] [Evidence or context.] [CTA verb phrase.]
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Variant B — Storytelling / Narrative
|
|
51
|
+
|
|
52
|
+
- Open with a scene, scenario, or relatable before-state
|
|
53
|
+
- Middle: transition to the insight or product context
|
|
54
|
+
- Close: resolution or CTA
|
|
55
|
+
- Tone: warm, specific, first-person or second-person
|
|
56
|
+
|
|
57
|
+
**Structure template:**
|
|
58
|
+
```
|
|
59
|
+
[Scene/scenario that the audience recognizes.] [Transition: "That's when we realized..." / "Here's what changed..."] [Insight or product context.] [CTA.]
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Variant C — Question / Engagement Hook
|
|
63
|
+
|
|
64
|
+
- Open with a direct question or provocative statement
|
|
65
|
+
- The question must be genuinely answerable in comments
|
|
66
|
+
- Follow with 1–2 supporting sentences before the CTA
|
|
67
|
+
- Tone: curious, conversational, invites participation
|
|
68
|
+
|
|
69
|
+
**Structure template:**
|
|
70
|
+
```
|
|
71
|
+
[Question the audience wants to answer?] [Context that makes the question worth answering.] [CTA that directs to comment or click.]
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Character Limit Compliance
|
|
77
|
+
|
|
78
|
+
Every caption variant must be checked against the platform character limit before being considered complete. The agent must note the character count in the Caption Copy Deck entry.
|
|
79
|
+
|
|
80
|
+
| Platform | Hard Limit | Target Range | Notes |
|
|
81
|
+
|---|---|---|---|
|
|
82
|
+
| Instagram | 2,200 | ≤150 (above fold) / up to 500 for educational | First 125 chars are critical — fold cuts here on mobile |
|
|
83
|
+
| LinkedIn | 3,000 | 150–300 for opening hook | Algorithm may suppress posts with very short captions on company pages |
|
|
84
|
+
| TikTok | 2,200 | ≤150 | First 150 chars visible before "more" |
|
|
85
|
+
| X/Twitter | 280 | ≤240 | Leave 40 chars for RT space |
|
|
86
|
+
| Pinterest | 500 | 100–300 | Keyword density matters for discovery |
|
|
87
|
+
| Bluesky | 300 | ≤280 | Hard limit — truncation destroys message |
|
|
88
|
+
| Mastodon | 500 | ≤400 | Instance limits may vary |
|
|
89
|
+
| Reddit | Variable | Long-form (300–1000 words) for text posts | Subreddit rules override; check before drafting |
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Emoji Usage Guidelines
|
|
94
|
+
|
|
95
|
+
| Platform | Usage Level | Notes |
|
|
96
|
+
|---|---|---|
|
|
97
|
+
| Instagram | Moderate (2–5 per caption) | Use as visual separators and tone enhancers |
|
|
98
|
+
| LinkedIn | Minimal (0–2 per post) | Bullets acceptable on company pages; personal posts: 0–1 |
|
|
99
|
+
| TikTok | Liberal (5–10) | Emoji-first hooks are platform-native |
|
|
100
|
+
| X/Twitter | Minimal (0–2) | One emoji at start of tweet is acceptable; more feels crowded |
|
|
101
|
+
| Pinterest | None to minimal (0–2) | Focuses on keyword discoverability |
|
|
102
|
+
| Facebook | Moderate (2–4) | Consistent with casual community tone |
|
|
103
|
+
| Bluesky | Minimal (0–2) | Text-first culture |
|
|
104
|
+
| Mastodon | None to minimal | Accessibility-first: screen readers read emoji alt-text |
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## AI Caption Quality Bar
|
|
109
|
+
|
|
110
|
+
A complete caption variant must:
|
|
111
|
+
|
|
112
|
+
1. **Stay within character limits** — hard requirement, not optional
|
|
113
|
+
2. **Have an explicit CTA** — at minimum: "Learn more", "Link in bio", "Comment below", "Drop your thoughts"
|
|
114
|
+
3. **Match platform tone** — LinkedIn caption must not read like a TikTok caption
|
|
115
|
+
4. **Reference the content** — caption must connect to the media asset or post topic
|
|
116
|
+
5. **Not open with "I"** — Instagram algorithm and general best practice: lead with the hook, not the subject
|
|
117
|
+
6. **Avoid placeholder language** — no "[INSERT BRAND NAME]" fragments in the final copy deck
|
|
118
|
+
7. **Be meaningfully different across A/B/C** — changing one word does not constitute a variant
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# BullMQ Queue Layer
|
|
2
|
+
|
|
3
|
+
**Scheduling manifest format and queue architecture for Postiz API submission.**
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Postiz uses BullMQ (backed by Redis) as its job queue for scheduled post publishing. When this kit generates a scheduling manifest, it produces a JSON file that can be submitted to the Postiz API's bulk scheduling endpoint. The API enqueues each post with a delay calculated from `scheduledAt - now()`.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Scheduling Manifest Format
|
|
14
|
+
|
|
15
|
+
The full JSON format for the scheduling manifest:
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"postizSchedulingManifest": {
|
|
20
|
+
"version": "1.0",
|
|
21
|
+
"workspaceId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
|
|
22
|
+
"generatedAt": "2026-04-15T10:00:00-05:00",
|
|
23
|
+
"dryRun": false,
|
|
24
|
+
"posts": [
|
|
25
|
+
{
|
|
26
|
+
"postId": "urbancycle-20260420-instagram-001",
|
|
27
|
+
"platform": "instagram",
|
|
28
|
+
"scheduledAt": "2026-04-20T09:00:00-05:00",
|
|
29
|
+
"content": "Building for the long game means planting seeds you won't harvest for years. At Urban Cycle, we're still running routes we mapped in 2021. Where are you building today that you won't see pay off until 2028? Share in the comments — we read every one. #urbanmobility #sustainableliving #cycling",
|
|
30
|
+
"mediaAssets": [
|
|
31
|
+
{
|
|
32
|
+
"type": "image",
|
|
33
|
+
"path": "assets/2026-04-20-instagram-001.jpg",
|
|
34
|
+
"altText": "Urban Cycle team on a community cycling route, morning light"
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"tags": ["#urbanmobility", "#sustainableliving", "#cycling"],
|
|
38
|
+
"status": "pending"
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Field Reference
|
|
48
|
+
|
|
49
|
+
| Field | Type | Required | Description |
|
|
50
|
+
|---|---|---|---|
|
|
51
|
+
| `version` | string | Yes | Manifest version — always `"1.0"` for this kit |
|
|
52
|
+
| `workspaceId` | string (UUID) | Yes | Postiz workspace UUID from Settings → Workspace |
|
|
53
|
+
| `generatedAt` | string (ISO 8601) | Yes | Manifest generation timestamp |
|
|
54
|
+
| `dryRun` | boolean | Yes | `true` for agent-only mode (no API submission); `false` for live submission |
|
|
55
|
+
| `posts[].postId` | string | Yes | Unique post identifier — see naming convention below |
|
|
56
|
+
| `posts[].platform` | string | Yes | Postiz platform integration ID (from `docs/platform-coverage.md`) |
|
|
57
|
+
| `posts[].scheduledAt` | string (ISO 8601) | Yes | Target publish timestamp with timezone offset |
|
|
58
|
+
| `posts[].content` | string | Yes | Full caption text (selected A/B/C variant) |
|
|
59
|
+
| `posts[].mediaAssets` | array | No | Media asset references (empty array if text-only post) |
|
|
60
|
+
| `posts[].mediaAssets[].type` | string | Yes | `"image"` \| `"video"` \| `"carousel"` |
|
|
61
|
+
| `posts[].mediaAssets[].path` | string | Yes | Relative path to asset file |
|
|
62
|
+
| `posts[].mediaAssets[].altText` | string | No | Accessibility alt text for images |
|
|
63
|
+
| `posts[].tags` | array | No | Hashtag strings (with `#` prefix) |
|
|
64
|
+
| `posts[].status` | string | Yes | Always `"pending"` in generated manifest |
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Post ID Naming Convention
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
<client-slug>-<YYYYMMDD>-<platform>-<sequence>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
| Part | Rule | Example |
|
|
75
|
+
|---|---|---|
|
|
76
|
+
| client-slug | Lowercase, hyphenated, no special chars | `urban-cycle` |
|
|
77
|
+
| YYYYMMDD | Scheduled post date | `20260420` |
|
|
78
|
+
| platform | Postiz platform ID | `instagram` |
|
|
79
|
+
| sequence | 3-digit zero-padded sequence | `001`, `002`, `003` |
|
|
80
|
+
|
|
81
|
+
**Example:** `urban-cycle-20260420-instagram-001`
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Timestamp Format
|
|
86
|
+
|
|
87
|
+
All `scheduledAt` values must use ISO 8601 format with explicit timezone offset:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
YYYY-MM-DDTHH:MM:SS±HH:MM
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Examples:**
|
|
94
|
+
- `2026-04-20T09:00:00-05:00` — 9am CDT
|
|
95
|
+
- `2026-04-20T09:00:00-04:00` — 9am EDT
|
|
96
|
+
- `2026-04-20T14:00:00Z` — 2pm UTC
|
|
97
|
+
|
|
98
|
+
Never use `Z` for local time unless the workspace timezone is explicitly UTC.
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Submission to Postiz API
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# Submit the scheduling manifest to Postiz bulk scheduling endpoint
|
|
106
|
+
curl -X POST "${POSTIZ_API_URL}/api/v1/posts/bulk" \
|
|
107
|
+
-H "Content-Type: application/json" \
|
|
108
|
+
-H "Authorization: Bearer <jwt-token>" \
|
|
109
|
+
-d @scheduling-manifest.json
|
|
110
|
+
|
|
111
|
+
# Verify queue health after submission
|
|
112
|
+
curl "${POSTIZ_API_URL}/api/v1/queue/health" \
|
|
113
|
+
-H "Authorization: Bearer <jwt-token>"
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Obtain the JWT token from Postiz admin UI → Settings → API Keys, or via `POST /api/v1/auth/login`.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Queue Monitoring
|
|
121
|
+
|
|
122
|
+
After submitting the manifest, monitor the BullMQ queue:
|
|
123
|
+
|
|
124
|
+
1. **Postiz admin UI** → Queue Management: shows pending, active, completed, and failed jobs
|
|
125
|
+
2. **API endpoint**: `GET /api/v1/queue/health` — returns queue stats
|
|
126
|
+
3. **Redis CLI** (advanced): `redis-cli monitor` — raw job events
|
|
127
|
+
|
|
128
|
+
### Job States
|
|
129
|
+
|
|
130
|
+
| State | Meaning |
|
|
131
|
+
|---|---|
|
|
132
|
+
| `waiting` | Job is queued, delay has not expired |
|
|
133
|
+
| `active` | Job is currently being processed (publishing now) |
|
|
134
|
+
| `completed` | Post was published successfully |
|
|
135
|
+
| `failed` | Post failed to publish — check error in admin UI |
|
|
136
|
+
| `delayed` | Job is waiting for `scheduledAt` time |
|
|
137
|
+
|
|
138
|
+
### Retry Logic
|
|
139
|
+
|
|
140
|
+
Postiz retries failed publish jobs 3 times with exponential backoff by default:
|
|
141
|
+
- Attempt 1: immediately after failure
|
|
142
|
+
- Attempt 2: 5 seconds after first retry
|
|
143
|
+
- Attempt 3: 30 seconds after second retry
|
|
144
|
+
|
|
145
|
+
Failed jobs after 3 attempts are moved to the dead letter queue and visible in the admin UI → Failed Jobs.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Dry-Run Mode
|
|
150
|
+
|
|
151
|
+
When `dryRun: true` in the manifest header:
|
|
152
|
+
- The manifest is produced as a JSON file but is **not submitted to the Postiz API**
|
|
153
|
+
- All `status` fields remain `"pending"`
|
|
154
|
+
- The manifest can be reviewed and submitted manually
|
|
155
|
+
- Use `dryRun: true` in all agent-only mode sessions
|
|
156
|
+
|
|
157
|
+
The agent must set `dryRun: true` automatically when the Postiz API is not reachable or when execution mode is `agent-only`.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Platform Coverage
|
|
2
|
+
|
|
3
|
+
**Supported Postiz integration IDs, format specs, and character limits.**
|
|
4
|
+
|
|
5
|
+
**Frozen at kit creation: 2026-04-15. Update when Postiz adds new platform integrations.**
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Platform Reference Table
|
|
10
|
+
|
|
11
|
+
| Platform | Postiz ID | Auth Method | Post Types | Char Limit | Image Spec | Video Spec |
|
|
12
|
+
|---|---|---|---|---|---|---|
|
|
13
|
+
| Instagram | `instagram` | Meta OAuth | image, video, reel, story, carousel | 2,200 | 1080×1080 (square), 1080×1350 (portrait) | 1080×1920 (reels), MP4, ≤90s |
|
|
14
|
+
| LinkedIn | `linkedin` | LinkedIn OAuth | text, image, video, document/carousel | 3,000 | 1200×627, PNG/JPG | MP4, ≤10 min |
|
|
15
|
+
| TikTok | `tiktok` | TikTok OAuth | video only | 2,200 | — | 1080×1920, MP4/MOV, 15s–10min |
|
|
16
|
+
| X (Twitter) | `twitter` | Twitter OAuth 2.0 | text, image, video, thread | 280 | 1200×675, ≤5MB | MP4/MOV, ≤2min 20s |
|
|
17
|
+
| YouTube | `youtube` | Google OAuth | video (long-form), shorts | N/A | Thumbnail: 1280×720 | MP4, any length; Shorts ≤60s, 1080×1920 |
|
|
18
|
+
| Pinterest | `pinterest` | Pinterest OAuth | image, video, idea pin | 500 | 1000×1500 (2:3 ratio) | MP4, 4s–15min |
|
|
19
|
+
| Reddit | `reddit` | Reddit OAuth | text, image, video, link | — subreddit rules | Varies by subreddit | MP4, ≤15min |
|
|
20
|
+
| Facebook | `facebook` | Meta OAuth | text, image, video, reel, story, carousel | 63,206 | 1200×628, PNG/JPG | MP4, ≤240min |
|
|
21
|
+
| Bluesky | `bluesky` | AT Protocol credentials | text, image, video | 300 | Up to 4 images, 1×1 to 3×4 | MP4, ≤60s |
|
|
22
|
+
| Mastodon | `mastodon` | OAuth (instance-specific) | text, image, video, poll | 500 (instance-configurable) | PNG/JPG/GIF/WebP | MP4/WebM/MOV |
|
|
23
|
+
| Slack | `slack` | Slack OAuth | text, image, file | — | PNG/JPG/GIF | MP4 |
|
|
24
|
+
| Telegram | `telegram` | Telegram Bot API token | text, image, video, document | 4,096 | JPEG, ≤10MB | MP4, ≤50MB |
|
|
25
|
+
| Discord | `discord` | Discord Bot token | text, image, video, embed | 2,000 | PNG/JPG/GIF, ≤8MB | MP4, ≤8MB |
|
|
26
|
+
| Threads | `threads` | Meta OAuth | text, image, video | 500 | 1:1 square; 4:5 portrait | MP4, ≤5min |
|
|
27
|
+
| Dribbble | `dribbble` | Dribbble OAuth | image, video | — | PNG/JPG/GIF, ≤30MB | — |
|
|
28
|
+
| Tumblr | `tumblr` | Tumblr OAuth | text, image, video, audio | — | PNG/JPG/GIF | MP4 |
|
|
29
|
+
| Medium | `medium` | Medium OAuth | article (long-form markdown) | — | Embedded images | — |
|
|
30
|
+
| DEV.to | `devto` | DEV API key | article (markdown) | — | Embedded images | — |
|
|
31
|
+
| Hashnode | `hashnode` | Hashnode API key | article (markdown) | — | Embedded images | — |
|
|
32
|
+
| Lemmy | `lemmy` | Lemmy credentials | text, image, link | — | PNG/JPG | — |
|
|
33
|
+
| Nostr | `nostr` | Nostr keypair | text, image | — | URLs (no direct upload) | — |
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Platform Selection Guidance
|
|
38
|
+
|
|
39
|
+
### Audience Demographics (2026 data — update when brand kit specifies more precise data)
|
|
40
|
+
|
|
41
|
+
| Platform | Primary Demographic | Dominant Use Case |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| Instagram | 18–34 (55% female) | Visual branding, lifestyle, product showcase |
|
|
44
|
+
| LinkedIn | 25–55 (professional) | B2B, thought leadership, hiring |
|
|
45
|
+
| TikTok | 18–34 | Short-form entertainment, product discovery |
|
|
46
|
+
| X/Twitter | 18–49 (male-skewed) | News, opinion, live commentary |
|
|
47
|
+
| YouTube | All ages (18–49 core) | Education, reviews, entertainment |
|
|
48
|
+
| Pinterest | 25–44 (female-skewed 70%) | Discovery, DIY, home, fashion, recipes |
|
|
49
|
+
| Reddit | 18–49 (male-skewed) | Community discussion, niche interests |
|
|
50
|
+
| Facebook | 35–65 | Community groups, local business, events |
|
|
51
|
+
| Bluesky | 18–40 (tech-forward) | Open protocol social, tech and media |
|
|
52
|
+
| Mastodon | 25–45 (tech-forward) | Open source, decentralized, privacy-aware |
|
|
53
|
+
| LinkedIn | — | — |
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Post Type Compatibility Matrix
|
|
58
|
+
|
|
59
|
+
| Post Type | instagram | linkedin | tiktok | twitter | youtube | pinterest | reddit | facebook | bluesky |
|
|
60
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
61
|
+
| Static Image | ✓ | ✓ | ✗ | ✓ | ✗ | ✓ | ✓ | ✓ | ✓ |
|
|
62
|
+
| Video | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
|
63
|
+
| Carousel / Slides | ✓ | ✓ | ✗ | ✗ | ✗ | ✓ | ✗ | ✓ | ✗ |
|
|
64
|
+
| Text Only | ✗ | ✓ | ✗ | ✓ | ✗ | ✗ | ✓ | ✓ | ✓ |
|
|
65
|
+
| Story | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✗ |
|
|
66
|
+
| Reel / Short | ✓ | ✗ | ✓ | ✗ | ✓ (Shorts) | ✗ | ✗ | ✓ | ✗ |
|
|
67
|
+
| Long-form Article | ✗ | ✓ (newsletter) | ✗ | ✗ | ✗ | ✗ | ✓ | ✗ | ✗ |
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Hashtag Best Practices by Platform
|
|
72
|
+
|
|
73
|
+
| Platform | Recommended Count | Strategy |
|
|
74
|
+
|---|---|---|
|
|
75
|
+
| Instagram | 3–5 | Mix niche + medium-volume (avoid over-tagging) |
|
|
76
|
+
| LinkedIn | 3–5 | Professional and industry-specific |
|
|
77
|
+
| TikTok | 3–6 | Mix trending sounds + niche tags |
|
|
78
|
+
| X/Twitter | 1–2 | In-text placement, campaign hashtags |
|
|
79
|
+
| Pinterest | 2–3 | Keyword-based for discoverability |
|
|
80
|
+
| Bluesky | 0–2 | Contextual only, rarely used |
|
|
81
|
+
| Mastodon | 2–4 | CamelCase for accessibility |
|
|
82
|
+
| Reddit | 0 | Subreddit flair instead |
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Posting Time Recommendations
|
|
87
|
+
|
|
88
|
+
*Based on general industry data. Override with client's own analytics if available.*
|
|
89
|
+
|
|
90
|
+
| Platform | Weekday Best Times (ET) | Weekend |
|
|
91
|
+
|---|---|---|
|
|
92
|
+
| Instagram | Mon–Fri: 9–11am, 6–8pm | Sat: 10am–12pm |
|
|
93
|
+
| LinkedIn | Tue–Thu: 8–10am, 12pm | Minimal weekend activity |
|
|
94
|
+
| TikTok | Mon–Fri: 7–9am, 7–9pm | Sat–Sun: 11am–1pm |
|
|
95
|
+
| X/Twitter | Mon–Fri: 8–10am, 12–2pm | Limited |
|
|
96
|
+
| Facebook | Tue–Thu: 9am–12pm | Sat: 12–1pm |
|
|
97
|
+
| Pinterest | Sat–Sun: 2–4pm, 8–11pm | All day |
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Postiz Fork Integration
|
|
2
|
+
|
|
3
|
+
**How this kit integrates with the Postiz open-source social media platform.**
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## What Postiz Is
|
|
8
|
+
|
|
9
|
+
[Postiz](https://github.com/gitroomhq/postiz-app) is an open-source, self-hosted social media scheduling and automation platform built on NestJS + Next.js. It supports 28+ social media platforms and ships with a BullMQ job queue, multi-workspace management, AI caption generation, media upload, and a public REST API.
|
|
10
|
+
|
|
11
|
+
GitHub: https://github.com/gitroomhq/postiz-app
|
|
12
|
+
License: MIT
|
|
13
|
+
Stars: ~28,000+ (as of kit creation)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Integration Architecture
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
growthub-postiz-social-v1 (this kit)
|
|
21
|
+
│
|
|
22
|
+
├── workers/postiz-social-operator/CLAUDE.md
|
|
23
|
+
│ Agent operating law — drives campaign planning, caption drafts,
|
|
24
|
+
│ scheduling manifest generation, and analytics briefing
|
|
25
|
+
│
|
|
26
|
+
├── setup/clone-fork.sh
|
|
27
|
+
│ Clones gitroomhq/postiz-app → ~/postiz-app
|
|
28
|
+
│ Runs docker compose up -d (starts Postiz + Redis + PostgreSQL)
|
|
29
|
+
│ Waits for API healthcheck at http://localhost:3000/api/healthcheck
|
|
30
|
+
│
|
|
31
|
+
├── setup/verify-env.mjs
|
|
32
|
+
│ Checks fork existence, API reachability, POSTIZ_WORKSPACE_ID, ANTHROPIC_API_KEY
|
|
33
|
+
│
|
|
34
|
+
└── templates/scheduling-manifest.md
|
|
35
|
+
BullMQ-compatible JSON manifest format for bulk post scheduling
|
|
36
|
+
via POST /api/v1/posts/bulk
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Service Topology
|
|
42
|
+
|
|
43
|
+
When running in local-fork mode, Postiz operates as a Docker Compose stack:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
postiz-app container (port 3000)
|
|
47
|
+
├── NestJS API (apps/backend/) ← REST API, BullMQ job scheduler
|
|
48
|
+
└── Next.js Frontend (apps/frontend/) ← Admin UI, calendar view, analytics
|
|
49
|
+
|
|
50
|
+
postiz-redis container (port 6379)
|
|
51
|
+
└── Redis ← BullMQ queue backend, session cache
|
|
52
|
+
|
|
53
|
+
postiz-postgres container (port 5432)
|
|
54
|
+
└── PostgreSQL ← Posts, workspaces, platform credentials, analytics
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
All services are defined in `docker-compose.yml` at the fork root.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Postiz API — Key Endpoints Used By This Kit
|
|
62
|
+
|
|
63
|
+
| Endpoint | Method | Purpose |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| `/api/healthcheck` | GET | Verify Postiz is running |
|
|
66
|
+
| `/api/v1/workspace` | GET | Retrieve workspace ID and metadata |
|
|
67
|
+
| `/api/v1/posts/bulk` | POST | Submit scheduling manifest |
|
|
68
|
+
| `/api/v1/posts/{id}` | GET | Verify a scheduled post |
|
|
69
|
+
| `/api/v1/analytics` | GET | Retrieve engagement analytics |
|
|
70
|
+
| `/api/v1/queue/health` | GET | Check BullMQ queue health |
|
|
71
|
+
| `/api/v1/posts/ai/generate` | POST | AI caption generation (Postiz-side) |
|
|
72
|
+
|
|
73
|
+
Authentication is via JWT bearer token. Obtain from Postiz admin UI → Settings → API Keys.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Platform Integration Layer
|
|
78
|
+
|
|
79
|
+
Platform integrations live under `libraries/nestjs-libraries/src/integrations/` in the Postiz repo. Each integration file:
|
|
80
|
+
- Defines the OAuth flow for connecting the platform account
|
|
81
|
+
- Implements `post()` for publishing content
|
|
82
|
+
- Implements `analytics()` for pulling engagement data
|
|
83
|
+
- Declares the integration ID (used as the `platform` field in scheduling manifests)
|
|
84
|
+
|
|
85
|
+
When this kit generates a scheduling manifest, platform IDs must match the integration IDs in the running Postiz instance. See `docs/platform-coverage.md` for the full list.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## AI Caption Generation
|
|
90
|
+
|
|
91
|
+
Postiz has its own AI caption generation endpoint (`/api/v1/posts/ai/generate`), activated when `OPENAI_API_KEY` or `ANTHROPIC_API_KEY` is set in the Postiz `.env`. This is **separate** from the agent-side caption drafting in this kit.
|
|
92
|
+
|
|
93
|
+
**This kit's caption workflow:**
|
|
94
|
+
- The `postiz-social-operator` agent drafts A/B/C caption variants using its own reasoning and the AI caption methodology in `docs/ai-caption-layer.md`
|
|
95
|
+
- Postiz's own AI caption feature is available to the user independently in the admin UI
|
|
96
|
+
- The kit does not call the Postiz AI endpoint — it produces its own caption drafts
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## BullMQ Queue Behavior
|
|
101
|
+
|
|
102
|
+
When a post is submitted to Postiz via `POST /api/v1/posts/bulk`:
|
|
103
|
+
|
|
104
|
+
1. Postiz validates the payload against the workspace's connected platforms
|
|
105
|
+
2. Each post is enqueued in BullMQ with a delay calculated from `scheduledAt - now()`
|
|
106
|
+
3. When the delay expires, BullMQ triggers the `publish-post` job
|
|
107
|
+
4. The job calls the platform integration's `post()` method
|
|
108
|
+
5. On success: post marked as `published` in PostgreSQL
|
|
109
|
+
6. On failure: retried up to 3 times (configurable), then moved to dead letter queue
|
|
110
|
+
|
|
111
|
+
Monitor the queue via Postiz admin UI → Queue Management, or via `GET /api/v1/queue/health`.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Workspace Isolation
|
|
116
|
+
|
|
117
|
+
Postiz supports multiple workspaces. Each workspace has:
|
|
118
|
+
- Its own set of connected platform accounts
|
|
119
|
+
- Its own posting queue
|
|
120
|
+
- Its own analytics data
|
|
121
|
+
- A UUID (`workspaceId`) required in all API calls
|
|
122
|
+
|
|
123
|
+
The `POSTIZ_WORKSPACE_ID` in this kit's `.env` must match the workspace configured in the Postiz admin UI. Get it from Settings → Workspace in the admin UI, or from `GET /api/v1/workspace`.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Inspecting the Fork Before Planning
|
|
128
|
+
|
|
129
|
+
Before generating any campaign or scheduling manifest, inspect the running Postiz instance:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
# Verify all containers are running
|
|
133
|
+
docker compose ps
|
|
134
|
+
|
|
135
|
+
# Check API health
|
|
136
|
+
curl http://localhost:3000/api/healthcheck
|
|
137
|
+
|
|
138
|
+
# List connected platform integrations (requires auth)
|
|
139
|
+
curl http://localhost:3000/api/v1/integrations \
|
|
140
|
+
-H "Authorization: Bearer <jwt-token>"
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Do not generate scheduling manifests for platforms that are not connected and authorized in the Postiz admin UI. Unconnected platform posts will fail at publish time.
|