feat: complete marketing command center with pipeline, UI, and asset generation

- Dashboard with campaign management, asset gallery, and publishing queue
- 7-agent pipeline: trend scout, research, scripts, ad creative, video, copy, distribution
- Campaign form with screenshot upload, goal picker, platform selection
- Campaign detail view with Details/Pipeline/Assets/Chat tabs
- Two-set image generation: Gemini AI (NanoBanana MCP) + Canvas Design posters
- Remotion video rendering with phone.png frame and real screenshot alignment
- honeyDue branding: blue #0079FF, orange #FF9400, Inter font, warm off-white
- Asset cards with source badges (Gemini/Canvas/Remotion/Playwright)
- Markdown/JSON render endpoint for viewing pipeline outputs as HTML
- Settings page with Tavily, Gemini, Postiz, Nextdoor integration management
- Claude Chat for campaign feedback loop with streaming SSE
- Postiz publishing modal with scheduling
- Auth with NextAuth credentials + JWT sessions
- SQLite via Prisma with better-sqlite3 adapter

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-03-23 21:05:26 -05:00
parent 6b08cfb73a
commit 66c2bbec8b
113 changed files with 12741 additions and 138 deletions
+70
View File
@@ -0,0 +1,70 @@
import { tavily } from "@tavily/core";
import { writeFileSync, mkdirSync } from "fs";
import { join } from "path";
const OUTPUT_DIR = join(
import.meta.dirname,
"..",
"outputs",
"task_management_feature_launch_20260323"
);
const queries = [
"home maintenance app download conversion strategies app store optimization 2026",
"homeowner forgot maintenance costly repair stories real examples",
"mobile app Instagram Reels ad creative best practices high CTR 2026",
"TikTok home improvement property management app ads that convert",
"millennial first time homeowner maintenance anxiety solutions apps",
];
async function runResearch() {
const client = tavily({ apiKey: process.env.TAVILY_API_KEY });
const results = [];
for (const query of queries) {
console.log(`Researching: "${query}"`);
try {
const response = await client.search(query, {
searchDepth: "advanced",
maxResults: 10,
});
results.push({
query,
timestamp: new Date().toISOString(),
resultCount: response.results.length,
results: response.results.map((r) => ({
title: r.title,
url: r.url,
content: r.content,
score: r.score,
})),
});
console.log(`${response.results.length} results`);
} catch (err) {
console.error(` ✗ Error for "${query}": ${err.message}`);
results.push({
query,
timestamp: new Date().toISOString(),
resultCount: 0,
results: [],
error: err.message,
});
}
}
const output = {
generatedAt: new Date().toISOString(),
agent: "marketing-research",
campaign: "task_management_feature_launch",
queryCount: queries.length,
queries,
results,
};
mkdirSync(OUTPUT_DIR, { recursive: true });
const outPath = join(OUTPUT_DIR, "research_results.json");
writeFileSync(outPath, JSON.stringify(output, null, 2));
console.log(`\nSaved: ${outPath}`);
}
runResearch();
+103
View File
@@ -0,0 +1,103 @@
import { tavily } from "@tavily/core";
import { writeFileSync } from "fs";
const client = tavily({ apiKey: process.env.TAVILY_API_KEY });
const OUTPUT_DIR = "/Users/treyt/Desktop/code/claude_marketing/pipeline/outputs/task_management_feature_launch_20260323";
const queries = [
{
query_id: 1,
query_name: "Industry Trends & Market Landscape",
search_terms: "home maintenance app market trends 2025 2026 property management software homeowners smart home task tracking reminders growth",
options: {
searchDepth: "advanced",
maxResults: 10,
topic: "news",
days: 30,
excludeDomains: ["pinterest.com", "etsy.com"]
}
},
{
query_id: 2,
query_name: "Competitor Analysis",
search_terms: "Centriq app vs HomeZada vs Thumbtack home maintenance tracking app features pricing reviews marketing 2025 2026",
options: {
searchDepth: "advanced",
maxResults: 10,
topic: "general",
includeDomains: ["centriq.com", "homezada.com", "thumbtack.com", "techcrunch.com", "producthunt.com", "g2.com", "capterra.com"],
excludeDomains: ["pinterest.com"]
}
},
{
query_id: 3,
query_name: "Audience Pain Points & Conversations",
search_terms: "homeowner forgot HVAC filter change maintenance tasks overwhelmed home upkeep checklist first time homebuyer maintenance schedule busy parents household chores",
options: {
searchDepth: "advanced",
maxResults: 10,
topic: "general",
includeDomains: ["reddit.com", "twitter.com", "quora.com", "houzz.com"],
excludeDomains: ["pinterest.com"]
}
},
{
query_id: 4,
query_name: "High-Performing Hooks & Ad Copy",
search_terms: "best performing mobile app ad hooks 2025 2026 home productivity app Instagram TikTok ad copy examples high engagement task management app marketing download conversion",
options: {
searchDepth: "advanced",
maxResults: 10,
topic: "general",
excludeDomains: ["pinterest.com", "etsy.com"]
}
},
{
query_id: 5,
query_name: "Viral Content & Cultural Moments",
search_terms: "viral home maintenance TikTok homeowner hack spring cleaning 2026 home organization trending content adulting homeownership meme cleaning routine",
options: {
searchDepth: "advanced",
maxResults: 10,
topic: "news",
days: 14,
excludeDomains: ["pinterest.com"]
}
}
];
async function runQueries() {
const results = [];
for (const q of queries) {
console.log(`Executing query ${q.query_id}: ${q.query_name}...`);
try {
const response = await client.search(q.search_terms, q.options);
results.push({
query_id: q.query_id,
query_name: q.query_name,
search_terms: q.search_terms,
results_count: response.results ? response.results.length : 0,
results: response.results || [],
answer: response.answer || null
});
console.log(` -> Got ${response.results ? response.results.length : 0} results`);
} catch (err) {
console.error(` -> Error on query ${q.query_id}: ${err.message}`);
results.push({
query_id: q.query_id,
query_name: q.query_name,
search_terms: q.search_terms,
results_count: 0,
results: [],
error: err.message
});
}
}
writeFileSync(`${OUTPUT_DIR}/raw_research_results.json`, JSON.stringify(results, null, 2));
console.log(`\nRaw results saved to ${OUTPUT_DIR}/raw_research_results.json`);
}
runQueries();
+54
View File
@@ -0,0 +1,54 @@
import { tavily } from "@tavily/core";
import { writeFileSync } from "fs";
const client = tavily({ apiKey: process.env.TAVILY_API_KEY });
const queries = [
{
name: "trending_hooks",
query: "trending social media hooks productivity apps 2026 viral opening lines scroll-stopping techniques instagram tiktok",
options: { topic: "news", days: 7, maxResults: 10 }
},
{
name: "competitor_ads",
query: "productivity app ad campaigns 2026 Notion Todoist TickTick Any.do advertising strategy messaging",
options: { topic: "news", days: 7, maxResults: 10, searchDepth: "advanced" }
},
{
name: "viral_formats",
query: "viral content formats instagram reels tiktok 2026 trending templates transitions app promotion",
options: { topic: "news", days: 7, maxResults: 10, searchDepth: "advanced" }
},
{
name: "audience_pain_points",
query: "productivity app complaints wishlist 2026 professionals time management frustrations reddit reviews",
options: { topic: "news", days: 7, maxResults: 10 }
},
{
name: "seasonal_timely",
query: "upcoming events March April 2026 productivity awareness days professional development seasonal marketing moments",
options: { topic: "news", days: 14, maxResults: 10 }
}
];
async function runSearches() {
const results = {};
for (const q of queries) {
console.log(`Searching: ${q.name}...`);
try {
const res = await client.search(q.query, q.options);
results[q.name] = res.results || [];
console.log(`${results[q.name].length} results`);
} catch (err) {
console.error(` → Error: ${err.message}`);
results[q.name] = [];
}
}
writeFileSync(
"/Users/treyt/Desktop/code/claude_marketing/pipeline/outputs/test_campaign_e2e_20260323/raw_search_results.json",
JSON.stringify(results, null, 2)
);
console.log("Done. Raw results saved.");
}
runSearches();
+56
View File
@@ -0,0 +1,56 @@
import { tavily } from "@tavily/core";
import { writeFileSync } from "fs";
const client = tavily({ apiKey: process.env.TAVILY_API_KEY });
async function runSearches() {
const searches = [
{
name: "trending_hooks",
query: "trending social media hooks home maintenance app 2026 viral opening lines scroll-stopping Instagram TikTok",
options: { maxResults: 10, topic: "news", days: 7 }
},
{
name: "competitor_ads",
query: "Centriq HomeZada Thumbtack home maintenance app ad campaign marketing 2026",
options: { maxResults: 10, searchDepth: "advanced", days: 14 }
},
{
name: "viral_formats",
query: "viral content formats Instagram Reels TikTok 2026 trending templates transitions video styles March",
options: { maxResults: 10, topic: "news", days: 7 }
},
{
name: "audience_pain_points",
query: "homeowner maintenance tasks forgotten complaints overwhelmed home upkeep HVAC filter reminders Reddit 2026",
options: { maxResults: 10, searchDepth: "advanced", days: 14 }
},
{
name: "seasonal_angles",
query: "spring home maintenance checklist 2026 April seasonal homeowner tasks events awareness days",
options: { maxResults: 10, topic: "news", days: 14 }
}
];
const results = {};
for (const search of searches) {
console.log(`\nSearching: ${search.name}...`);
try {
const result = await client.search(search.query, search.options);
results[search.name] = result.results;
console.log(` Found ${result.results.length} results`);
} catch (err) {
console.error(` Error: ${err.message}`);
results[search.name] = [];
}
}
writeFileSync(
"/Users/treyt/Desktop/code/claude_marketing/pipeline/outputs/task_management_feature_launch_20260323/raw_search_results.json",
JSON.stringify(results, null, 2)
);
console.log("\nAll searches complete. Raw results saved.");
}
runSearches();