Back to Blog

Vibe Marketing: How I Run Meta Ads with Manus and a GitHub Repo

I built a loop where AI generates ad creatives, tests them on Meta, and tells me what's working. Three iterations in, my cost per result is a third of industry average.

Sean Robb
5 min read
#ai

For ten months, one person ran Anthropic’s entire growth marketing operation. Not because of budget constraints. Anthropic could hire any team they wanted. One person with the right AI toolkit was just more effective than a team without one.

Austin Lau, a non-technical marketer who had to Google how to open Terminal, built an AI toolkit that turned two hours of ad creation and iteration into fifteen minutes. Paid search, paid social, email, SEO. All solo. The toolkit handled the volume. He focused on the decisions.

I’m a bootstrapped solopreneur, not Anthropic. I can’t afford the team. But the lesson is the same: build the toolkit and let it handle the volume. So I started building my own version of that loop, using Manus instead of Claude Code because of its direct connection to Meta’s ad platform.

The System

I tried Claude first to generate some ad assets. It worked, but then I found Manus. It connects directly to Meta’s ad platform and to my GitHub repo. That meant the whole loop without me building the integrations.

Here’s how the creative pipeline works. I have HTML templates, one per card type: comparison tables, problem statements, product spotlights, direct challenges. Brand colors, fonts, and copy all live in a single JSON config file called variants.json. When I want a new variant, I don’t touch the template. I add an override entry: take this base card, swap these fields. The config is the single source of truth.

The repo looks like this:

ad-creatives/
├── variants.json       ← single source of truth
├── templates/          ← HTML, one per card type
├── render.py           ← renders HTML → PNG
└── cards/              ← generated PNGs

Variant experiments in variants.json look like this:

{
  "variants": {
    "v1-direct": {
      "hypothesis": "Direct challenge outperforms question",
      "base": "ad-card",
      "overrides": { "headline": "Your ads aren't working." }
    },
    "v2-question": {
      "hypothesis": "Questions create curiosity gaps",
      "base": "ad-card",
      "overrides": { "headline": "What if your ads actually worked?" }
    }
  }
}

Each variant has a hypothesis. That’s what makes this a test instead of a random shuffle.

A simple script renders each card to a PNG. Every variant, every copy change, every color tweak is a commit. Git log is the creative decision log.

The Pipeline — from config to campaign
Me Manus GitHub Meta Ads kick off a campaign PR with variants + PNGs review + merge upload PNGs

I give Manus the GitHub repo and ask for three variant ad creatives. It has the full context: the website, the existing templates, the brand tokens. If the variants make sense and the PNGs look good, I merge and upload.

The Loop

Every cycle starts with me. I ask Manus what’s working, it pulls the performance data from Meta, and tells me what to kill and what to double down on. Then it generates the next batch of variants based on what’s working.

The Iteration Loop — repeat every 24-48 hours
Me Manus GitHub Meta Ads what's working? pulls performance data kill / double down generate next variants PR with variants + PNGs review + merge upload PNGs

Three iterations deep. $0.15 cost per result, a third of the industry average. About an hour of hands-on time every couple of days.

Winning categories are starting to emerge. The comparison table cards keep beating the product spotlights. Direct problem framing keeps beating aspirational copy. The signal gets stronger each cycle because Manus feeds the previous round’s results into the next round’s decisions.

Try It Yourself

It’s not polished. Manus sometimes duplicates entire templates instead of using the override pattern, and sometimes the “variants” are just word swaps with no real hypothesis behind them. I end up cleaning up after it. The upload to Meta is still manual.

But before this, my options were to learn marketing from scratch, hire someone I couldn’t yet justify, or hand it to an agency that charges monthly and shows you a dashboard you don’t trust. Now I have a repo, a loop, and an hour every few days.

If you want to try something similar, the pieces are: Manus for the Meta Ads integration, HTML templates for your creative, a render script, and a GitHub repo to version-control the whole thing. Here’s a prompt to kick off the first cycle:

I have a GitHub repo with an ad creative system for my product. The repo is at [YOUR_GITHUB_REPO_URL]. The system works like this: - HTML templates live in templates/*.html (one per card type) - All copy, brand tokens, and layout config live in variants.json - A render script turns each card into a 1080x1080 PNG
I have a GitHub repo with an ad creative system for my product. The repo is at [YOUR_GITHUB_REPO_URL]. The system works like this: - HTML templates live in templates/*.html (one per card type) - All copy, brand tokens, and layout config live in variants.json - A render script turns each card into a 1080x1080 PNG - Variant experiments override specific fields on a base card — they don't duplicate templates I want to run a Meta Ads campaign. Please: 1. Review the repo — look at the existing templates, the variants.json structure, and the brand tokens 2. Create 3 variant experiments in variants.json that test different angles: - Each variant should reference an existing base card - Each variant needs a hypothesis comment explaining what we're testing - Override only the fields that change — don't duplicate the template 3. Open a PR on the GitHub repo with the new variant entries 4. Once I've reviewed and merged the PR, I'll upload the PNGs and set up a Dynamic Creative ad set on Meta targeting [YOUR_AUDIENCE] Focus on structural differences, not word swaps. Test a different emotional hook, a different visual hierarchy, or a different framing of the problem. "Boost" vs "grow" is not a test.

Start with three variants and 48 hours. See what the data says.