# Napkin.ai Content Prompts — S83-H98

**Date:** 2026-04-27
**Purpose:** 4 napkin.ai diagrams designed as **standalone LinkedIn content assets** — each generates a shareable diagram + has a companion post draft Brady can paste or rewrite.
**Brady time per prompt:** ~10 min (paste, generate, screenshot, paste post text)
**Total Brady time for batch:** ~40 min

---

## Why these are different from the prior 3 napkin docs

The prior napkin prompts (DS architecture + MM funnel) were **internal diagrams** — useful for slides, not directly publishable. These 4 are **content assets**: each diagram works as a single LinkedIn post with the companion text. Reframes napkin from "internal slide tool" to "distribution content engine."

**This directly feeds the ROI doc P0 distribution sprint** — Brady's 3x/week LinkedIn cadence needs visual content.

---

## How to use this doc

1. Open napkin.ai (free tier is fine for first attempt).
2. For each prompt, paste the **napkin input** into the prompt box.
3. Generate. If output is too busy, simplify to 5 elements and retry.
4. Export as PNG (1200×627 LinkedIn-ready).
5. Open LinkedIn, paste the **companion post draft**, attach the PNG.
6. Edit the post in your voice — the draft is a starting point, not a script.

---

## Prompt #1 — "How I run 8 brands solo" (overview map)

**Distribution surface:** LinkedIn post #1 of distribution sprint
**Aspect ratio:** 16:9 (LinkedIn auto-crops to 1.91:1)

### Napkin.ai input

```
A solo operator manages 8 connected brands. Show them as 8 boxes arranged around a central hub labeled "Witch Haven Grove LLC". Each brand is one box: RoseCourt (events), Mirror Mirror (infrastructure), Grove House (land), Witch Haven Grove (botanical), Small Stage (audio), LongHouse (civic), CC:Universe (broadcast), Brady Hugins (personal). Lines connect the central hub to each brand. Use 4 colors to group the brands: warm tones for community brands (RC, SS), cool tones for infrastructure brands (MM, LH), earth tones for land brands (GH, WHG), gold for personal/distribution (Brady, CC:Universe). Title at top: "8 brands. 1 person. 0 hires."
```

### Companion LinkedIn post draft (~150 words)

```
8 brands. 1 person. 0 hires.

Most people see this and assume it can't work. Or that it must be chaos.

It's not chaos. It's a single technical stack:
- Airtable as the database
- n8n as the glue
- Cloudflare Pages for sites
- Stripe for payments
- Resend for email

Each brand has its own voice (codified in a Python file). Its own surface (one site, one or two products). Its own conversion path.

What they share is the operator and the infrastructure. What they don't share: the audience.

Mirror Mirror sells competence. Grove House sells deliverables. Witch Haven Grove sells products. RoseCourt invites. Small Stage produces.

Same person. Same week. Different door.

If you're running multiple things, the question isn't "how do you keep up." It's "what's the one infrastructure that lets each thing speak in its own voice?"

Reply with what you're juggling. I'll tell you which two should be one brand.
```

### If napkin output is too busy
Simplify the input to 5 elements: "8 brands grouped into 4 categories (Community, Infrastructure, Land, Personal), each labeled with one product."

---

## Prompt #2 — "Don't build infrastructure for traffic that doesn't exist" (anti-pattern)

**Distribution surface:** LinkedIn thought-leadership post
**Aspect ratio:** 1:1 (best for IG cross-post)

### Napkin.ai input

```
A two-panel comparison. Left panel labeled "What I built": a stack of 7 boxes — 245 workflows, 8 sites, 5 databases, 20 products, 3 email systems, 1 PDF service, 1 calendar sync. The stack is tall and complete. Right panel labeled "What I had": one box — 80 members, 4 real signups in 90 days. The right stack is tiny. Below both panels, a single sentence: "Infrastructure isn't the bottleneck."
```

### Companion LinkedIn post draft (~140 words)

```
I spent 18 months building infrastructure for 1,000 customers.

I had 4.

Real ones. Not test accounts. Not backfill imports. Not me pretending to be a customer.

Four people gave me money in 90 days.

The infrastructure works. Every form, every payment link, every email queue, every Stripe webhook — all wired, all tested, all idempotent.

The audience didn't show up.

I built the cathedral before I had a congregation.

Here's the diagnosis nobody wanted to give me: the bottleneck isn't another workflow. It's distribution. It's me, posting on LinkedIn three times a week. It's me, having coffee with the partner I keep meaning to call. It's the work I can't automate.

If you're a builder reading this: stop. Audit who's actually buying. If the answer is "nobody yet," every new feature is a delay tactic.

Distribution is the work.
```

---

## Prompt #3 — "Stripe webhook side-effect idempotency" (technical credibility)

**Distribution surface:** LinkedIn technical/builder post (Mirror Mirror positioning)
**Aspect ratio:** 16:9

### Napkin.ai input

```
A Stripe webhook fires once. Show 7 downstream side effects fanning out from a central "Stripe Event" circle. Each side effect is a labeled box: 1) Email Send (Resend), 2) Meta CAPI Purchase, 3) GA4 Purchase, 4) Discord Notification, 5) GH Invoice Issuer, 6) Star Map Fulfillment, 7) Affiliate Commission Tracker. For each box, show a small dedup key: "Stripe Event ID" or "Payment Intent ID" or "n/a (accept duplicates)" or "platform handles dedup". Color: green for boxes with idempotency, gray for those without. Add a title: "If Stripe replays, none of these fire twice."
```

### Companion LinkedIn post draft (~130 words)

```
Stripe will replay your webhook for 3 days if your endpoint flakes once.

If you have side effects (email, ad pixels, invoice generation, fulfillment), every replay risks running them twice.

The wrong fix: flip a "Status" field on the event row from "Received" to "Processed."

Why wrong: that's at the workflow level. Any node that throws after the flip leaves you in a state where Stripe replays AND your code thinks it already ran.

The right fix: per-side-effect dedup keys. Each side effect gets its own gate.

Email send → check Email_Send_Log for the Stripe Event ID before sending.
Meta CAPI → pass event_id, let Meta dedup.
Affiliate commission → check Affiliate_Commissions for the Payment Intent ID.

7 side effects, 7 gates. Stripe can replay all day. Customer gets one email.

Boring infrastructure beats clever infrastructure.
```

---

## Prompt #4 — "Per-brand voice constraint matrix" (brand design positioning)

**Distribution surface:** LinkedIn brand-design post
**Aspect ratio:** 16:9

### Napkin.ai input

```
A 7-row table. Each row is one brand. Columns: Brand name, Tone, "Speaks like", CTA style. Rows:
1. RoseCourt | warm, inviting, grounded | friend holding the door open | "Come find us"
2. Grove House | direct, blue-collar, earned | contractor who reads soil reports | "Scout's Report — $250"
3. Witch Haven Grove | grounded mysticism, seasonal | knows every plant by name | "Get Solshine"
4. Mirror Mirror | competent, direct, operational | runs the infrastructure they teach | "Free webinar to start"
5. Small Stage | theatrical, expressive, respectful | producer who listens to your demo | "Step Onto the Stage"
6. LongHouse | research-grade, efficient | planner who saves you $50K | "Discovery + Brief"
7. Brady Hugins | direct, opinionated, specific | traded the desk for the dirt | "Work / Join / Learn"

Title above the table: "7 brands. One operator. One Python file enforces all of this."
```

### Companion LinkedIn post draft (~140 words)

```
The hardest part of running 7 brands isn't the work. It's not sounding like the same person on every surface.

So I codified it.

`shared/brands.py` is a Python file with 7 brand entries. Each one has: tone, who-it-speaks-like, CTA style, sample CTAs, palette hex codes.

When I write copy for any surface — a page, an email, a Stripe product — I check the file. The file checks me.

It's not just a style guide. It's enforced. The site builders import the brand registry. Every CTA renders from the brand's `cta_style`. Every email signature pulls from the brand's `from_address`.

If I drift into "vibrant community" or "transformative experience" on a Grove House page, the build catches it (kill phrases auto-flagged).

7 brands. One person. One Python file enforces all of this.

The brand discipline isn't in your head. It's in the code.
```

---

## Run order for Brady (across 1 week)

| Day | Prompt | Why |
|---|---|---|
| Mon | #1 "8 brands solo" | Anchor post — sets up the rest |
| Wed | #2 "Don't build infrastructure" | The Hard Truth — high engagement |
| Fri | #3 "Webhook idempotency" | Technical credibility |
| Following Mon | #4 "Brand voice matrix" | Positioning Mirror Mirror as the tool |

**Pace = 1 post per cadence day** = 4 posts in 7 days = **start of P0 distribution sprint**.

If napkin output is unusable on first try, screenshot the napkin failure, paste the text alone (without diagram). Text-only LinkedIn posts perform fine. The diagram is a multiplier, not a requirement.

---

## What CC does after Brady ships these

1. Saves each generated diagram to `~/docs/ecosystem/distribution/napkin_h98/`
2. Logs the LinkedIn post URL + impressions/engagements after 48 hours (Brady reports back)
3. Updates `~/docs/ecosystem/distribution/sprint_log.md` (creates the file on first post)
4. After 4 weeks of data, drafts an "what worked" recap so prompt #5-8 can be tuned to actual signal

The measurement loop only works if Brady ships the posts. **No posts → no signal → no improvement.**
