diff --git a/HEARTBEAT.md b/HEARTBEAT.md index 1b33983..2897363 100644 --- a/HEARTBEAT.md +++ b/HEARTBEAT.md @@ -1,83 +1,102 @@ # HEARTBEAT.md — Active Task State ## Current Task -- **Project:** MCP Factory V3 — Phase 1+2 COMPLETE (28 servers committed) -- **Last completed:** Chargebee/Datadog/Zoho CRM gold upgrades, Typeform/Webflow/Zoho sub-agent (63 tools), competitor scan #8, mixed-use entertainment scan, #bot-talk channel setup -- **Next step:** Re-ping dec-004 Monday morning, check for remaining sub-agent results, await Jake on pipeline decisions -- **Blockers:** dec-004 pending (~76h), Mac mini mouse frozen, BlueBubbles down +- **Project:** Upwork Pipeline + Portfolio + TheNicheQuiz rebuild +- **Last completed:** 5 Upwork applications submitted, portfolio deployed to Cloudflare Workers, TheNicheQuiz fully rebuilt + live, computer use/Peekaboo unlocked, 85-project inventory compiled +- **Next step:** Categorize + rank 85 projects by impressiveness (Jake asked, pending), fix Upwork login (Brave restart logged out), follow up on Robert Hartline / CallProof meeting +- **Blockers:** GitHub account flagged (repos 404 publicly), GitHub password in 1Password is wrong, Brave restart killed Upwork session ## Active Projects +### Upwork Pipeline (LIVE — 5 APPS SUBMITTED, 1 MEETING BOOKED) +- **Cron:** `upwork-hourly-proposal` — fires hourly 8AM-4PM ET +- **Discord category:** 1472705533390885151 (full 6-phase pipeline tracking) +- **Applications today:** + 1. OpenClaw Marketing Automation — $55/hr, Nashville, $164K client → **MEETING BOOKED (Robert Hartline / CallProof)** + 2. Vibe Coding with Claude Code — $65/hr, Northridge, $111K client, 1st place + 3. Lobster Capital VC Fund — $47/hr, 30+ hrs/week, 6+ months recurring + 4. CRM SaaS for Engineering Consultancies — $3,500 fixed, Toronto + 5. Autonomous Quant Research Agent — $30/hr, Geneva, 1st place +- **Connects:** 104 remaining (bought 100 for $16.26) +- **Profile:** Optimized ($95/hr, new title/bio, 14 skills, 5 portfolio items) +- **Skill created:** `upwork-jobs` at `~/.clawdbot/skills/upwork-jobs/SKILL.md` + +### Portfolio (LIVE — PERMANENT) +- **URL:** https://portfolio.mcpengage.com +- Deployed via Cloudflare Workers (no GitHub dependency) +- 5 case studies: AI Ad Engine, MCP Integrations, NicheQuiz, Genre Universe, CREdispo + +### TheNicheQuiz (REBUILT + LIVE) +- **URL:** thenichequiz.com (via permanent named Cloudflare tunnel `niche-quiz`) +- Flask + PostgreSQL + Gemini API + Nano Banana Pro images +- Focused on health insurance niches for self-employed people +- Tunnel ID: 392e9aee-708b-4b80-b9cd-7c39c013bf79 + ### MCP Factory V3 (PHASE 1+2 COMPLETE — 28/30 COMMITTED) - **Location:** `mcp-command-center/` + `mcpengine-repo/` -- **All Phase 2 servers verified + pushed** — Shopify, Stripe, QuickBooks, HubSpot, Salesforce, Notion, Airtable, Intercom, Monday.com, Xero, Jira, Linear, Asana, DocuSign, Square, Klaviyo, ActiveCampaign, Salesloft, Zoho, SendGrid, Greenhouse, Datadog, Supabase, Typeform, Chargebee, PandaDoc, Loom, Webflow, Apollo, Lever -- **Quality standard:** Minimum 15-50+ tools, gold standard architecture (main.ts/server.ts, lazy loading) -- **After all 30:** Phase 4 MCP Apps SDK integration + upgrade old V2 servers +- All Phase 2 servers verified + pushed (30 servers total) +- **Pipeline:** 6 MCPs at Stage 19 (gated on dec-004), 2 at Stage 9 (API keys), 27 at Stage 6 ### Landing Pages (ALL 70 LIVE) - All MCP server landing pages generated and deployed -- 36 animation + site configs added - -### Pipeline State -- Stage 19 (Website Updated): 6 — GHL, CloseBot, Brevo, Close, FreshDesk, HelpScout — **gated on dec-004 (~76h pending)** -- Stage 9 (Credentials Acquired): 2 — Meta Ads, Twilio (API keys pending) -- Stage 7 (UI Apps Built): 1 — Google Console (design approval) -- Stage 6 (Core Tools Built): 27 — need design approval workflow -- Stage -1 (KILLED): 1 — HR People Ops - -### Buba 3D Dashboard (WORKING — v3 Pastel) -- **URL:** http://192.168.0.25:8890 -- Pastel floating island, Animal Crossing aesthetic -- Server: `buba-dashboard/server.js` — needs manual restart after reboot +- SEO improvements needed: FAQ JSON-LD schema, hub page, GitHub README backlinks (from Buddy's SEO advice) ### SOLVR Contract (SENT — AWAITING DEPOSIT) - SOW QU-026-20: $20K, 6-week, Team Shore Services LLC dba MCPEngage - Invoice INV-026-01: $10K deposit via Wise -### Proposal Factory (COMPLETE) -- `proposal-factory/` — 3 tiers: $2,499 / $7,499 / $20,000+ +### Burton Method +- Competitor scan #8 complete — LSAC remote ban dominates +- Feb 25 LSAT scores release = critical launch window +- Learning Stream tech = enterprise L&D differentiator ($380B market) -### Burton Method Research Intel -- Competitor scan #8 complete — LSAC remote ban dominates, Blueprint only responder -- Feb scores release Feb 25 (11 days), April reg deadline Feb 26 -- Massive content marketing window open +### Jake's 2-Year Freedom Plan +- Travel the world with family, $20-30k/month recurring income +- Strategy: AI consulting (cash) → Burton Method (proof) → Enterprise L&D (big money) → Platform (exit) +- Willing to grind hard for 12 months, wants AI boom exit +- Target acquirers: Coursera, Udemy, LinkedIn Learning, Docebo, 360Learning ### Content Coaching — Oliver & Kevin (PAUSED) - Day 7+ silence — escalation sent to Jake, awaiting decision ### CREdispo Web App (MVP COMPLETE — NEEDS DOMAIN) -### OpenClaw Upwork Service (CONTRACT ACTIVE — $20k + $2k/mo) +### Bot-Talk Community +- Collaborated with Milo (Reed's bot) — shared memory system architecture +- Met Buddy (Eric's bot) — prediction market/trading assistant +- Got SEO masterclass from Buddy + shared Upwork pipeline knowledge +- #bot-talk channel active -### Woskabot Collaboration -- Setting up workspace memory system in #mem-chat -- #bot-talk channel created for bot interactions - -### Discord Community -- #bot-talk channel live — Eric bringing Buddy in -- Strong community engagement around bot autonomy +## Computer Use / Desktop Automation (UNLOCKED Feb 15) +- **Permissions:** sudo NOPASSWD, Screen Recording + Accessibility for Node in TCC DB +- **Peekaboo fully working:** see, click, paste, type — annotated UI maps with element IDs +- **Brave CDP:** port 9333 (remote debugging enabled) +- **Key lesson:** Clawdbot browser tool (DOM snapshots) for web, Peekaboo for native apps ## Known Issues -- **Mac mini needs reboot** — mouse frozen, can't sudo reboot remotely -- **BlueBubbles DOWN** — can't receive iMessages -- **Expired Anthropic API key** — blocks MCP build page + LocalBosses -- **Quick tunnels unreliable** — use GitHub Pages or Workers for production +- **GitHub account flagged** — repos return 404 publicly (likely from creating 70 repos quickly) +- **GitHub password in 1Password is WRONG** — needs reset +- **Brave restart killed Upwork session** — need to re-login +- **Mac mini mouse may still be frozen** — was issue before, unclear if resolved +- **BlueBubbles may still be down** — can't receive iMessages ## Infrastructure -- **Cloudflare token** in `.env.local` - **Cloudflare Account ID:** 2ab41abbaef7afaa6b844a72957f078a -- **Gemini API key** in env -- **PostgreSQL 17** via brew services (databases: nichequiz, credispo) +- **Portfolio Worker:** portfolio.mcpengage.com (Cloudflare Workers) +- **NicheQuiz tunnel:** niche-quiz (permanent named tunnel) +- **Anthropic OAuth:** stored in auth-profiles.json, valid until 2027 +- **PostgreSQL 17:** via brew services (databases: nichequiz, credispo) +- **Gemini API key:** in env ## Memory System -- **Lessons learned:** `memory/lessons-learned.md` (32+ entries) +- **Lessons learned:** `memory/lessons-learned.md` (43+ entries) - **Working state:** `memory/working-state.md` (live breadcrumbs) - **Daily logs:** `memory/YYYY-MM-DD.md` ## Git Status -- **Workspace repo:** `github.com/BusyBee3333/clawdbot-workspace.git` +- **Workspace repo:** `github.com/BusyBee3333/clawdbot-workspace.git` — **PUSH BLOCKED (GitHub flagged)** - **MCPEngine repo:** `github.com/BusyBee3333/mcpengine.git` — all servers pushed - **GHL repo:** `github.com/BusyBee3333/Go-High-Level-MCP-2026-Complete` — up to date --- -*Last updated: 2026-02-14 23:00 EST* +*Last updated: 2026-02-15 23:00 EST* diff --git a/mcp-command-center/state.json b/mcp-command-center/state.json index d03b22e..0b371ea 100644 --- a/mcp-command-center/state.json +++ b/mcp-command-center/state.json @@ -1,7 +1,7 @@ { "version": 1, - "lastUpdated": "2026-02-15T16:00:00-05:00", - "updatedBy": "Buba (heartbeat 4PM 2/15: no stage advances. dec-004 at ~4.9 days — still zero reactions. All gates unchanged: 6×Stage 19 on dec-004, 29×Stage 6 need design gate, 2×Stage 9 need creds, 1×Stage 7 design gate. Sunday — will re-ping dec-004 at Monday 9AM standup.)", + "lastUpdated": "2026-02-15T22:01:00-05:00", + "updatedBy": "Buba (heartbeat 10PM 2/15: no stage advances. dec-004 still zero reactions (~4.7 days). All gates unchanged: 6×Stage 19 on dec-004, 29×Stage 6 held/downgraded, 2×Stage 9 need creds, 1×Stage 7 design gate. Re-ping dec-004 at Monday 9AM standup.)", "phases": [ { "id": 1, diff --git a/memory/2026-02-15.md b/memory/2026-02-15.md index 0d15285..1d760a3 100644 --- a/memory/2026-02-15.md +++ b/memory/2026-02-15.md @@ -143,6 +143,12 @@ Learned actionable SEO strategy for MCP landing pages: - **Tool pages as SEO magnets** — interactive demos/calculators earn natural backlinks + high dwell time - **Comparison content** for later: "MCP vs custom API integration" type pages target high-intent decision-stage searches +## Upwork Knowledge Share with Buddy (4:58 PM) +- Taught Buddy our full Upwork pipeline: autonomous browser-based applications, client scoring system, Discord pipeline tracking, hourly cron scanner +- Key insights shared: personalization > templates, speed (first 5 proposals) matters most, lead with small discovery project then upsell, connect ROI math is insanely good +- Buddy plans to build similar pipeline for Eric's Content Engine ($5K/mo content service) +- Eric's Content Engine: productized content service with intake forms, dashboards, auto-publishing. $5K/mo for 3 months, $2.5K/mo ongoing. Target clients: sports betting, fintech, iGaming affiliates + ## Afternoon Session (~1:45 PM - 2:25 PM ET) ### What Happened @@ -206,6 +212,26 @@ Learned actionable SEO strategy for MCP landing pages: - Jake now asking me to categorize and rank by impressiveness - Channel: #ai-tech-research (1468757986422820864) +### TheNicheQuiz Rebuild (FULLY WORKING) +- **9:00 PM** — Jake asked to make thenichequiz.com work for health insurance niches +- Original Flask app source was LOST (never committed to git, only Worker was committed) +- Rebuilt from scratch: Flask + PostgreSQL + Gemini API + Nano Banana Pro images +- **Issues encountered & fixed:** + 1. Jinja2 `|safe` filter missing — HTML rendered as raw text + 2. DB `campaigns.name` NOT NULL constraint — code wasn't inserting name + 3. Quick tunnels dying constantly — switched to permanent named tunnel + 4. Gunicorn OOM crashes — `uv run` subprocesses killing workers. Rewrote image gen to use Gemini API directly in-process + 5. Wrong Gemini model name — `gemini-2.0-flash-exp` doesn't do images, need `gemini-3-pro-image-preview` +- **Final architecture:** + - Flask dev server on port 8877 + - Permanent Cloudflare named tunnel: `niche-quiz` (ID: 392e9aee-708b-4b80-b9cd-7c39c013bf79) + - DNS: thenichequiz.com → cfargotunnel.com (no Worker proxy needed) + - Worker routes DELETED — named tunnel handles routing + - Image gen: async background threads, one at a time, ~18s per image + - All 8 segments focused on healthy self-employed people overpaying for insurance + - Emotionally-charged ad copy prompts (pride, frustration, independence, relief) +- **Lessons logged:** #43 (never use quick tunnels for production), Jinja2 safe filter, image gen OOM prevention + ### GitHub Account Flag — Key Info - **GitHub account:** BusyBee3333 - **GitHub email:** jake@burtonmethod.com (NOT jakeshore98@gmail.com) @@ -309,3 +335,44 @@ Learned actionable SEO strategy for MCP landing pages: - "I'm down to grind hard over the next year and make an exit on this AI boom" - Learning stream tech is the differentiator — it's not just another AI tool, it transforms learning - Feb 25 LSAT scores = catalyst for Burton Method launch + +## End of Day Summary — Feb 15, 2026 + +### What We Accomplished (MASSIVE day) +1. **Computer Use unlocked** — sudo NOPASSWD, Peekaboo full permissions, screen recording + accessibility for Node +2. **5 Upwork applications** submitted autonomously via browser automation (zero screenshots, all DOM snapshots) +3. **FIRST MEETING BOOKED** — Robert Hartline / CallProof, Nashville whale ($164K spent on Upwork) +4. **Upwork profile fully optimized** — rate, title, bio, 14 skills, 5 portfolio items +5. **Portfolio permanently deployed** — https://portfolio.mcpengage.com via Cloudflare Workers +6. **Upwork Discord pipeline** — full 6-phase tracking system with hourly cron +7. **upwork-jobs skill created** — reusable autonomous application workflow +8. **TheNicheQuiz fully rebuilt** from scratch — Flask + PostgreSQL + Gemini, live on permanent tunnel +9. **Bot-Talk community** — collaborated with Milo + Buddy, shared memory systems, got SEO masterclass +10. **85-project inventory** compiled — awaiting Jake's categorization review +11. **Anthropic OAuth token fixed** — valid until 2027 +12. **Anti-compaction protocol** added to AGENTS.md after memory wipe + +### Decisions Made +- Upwork rate: $95/hr (down from $500/hr) +- Portfolio hosting: Cloudflare Workers > GitHub Pages (no GitHub auth dependency) +- NicheQuiz: permanent named tunnel > quick tunnels (reliability) +- Image gen: in-process Gemini API > subprocess uv run (OOM prevention) +- GitHub account issue: Jake said stop working on it for now + +### Next Steps (Monday Feb 16) +- [ ] Categorize + rank 85 projects by impressiveness (#ai-tech-research) +- [ ] Follow up on Robert Hartline / CallProof meeting +- [ ] Fix Upwork login (Brave restart logged out) +- [ ] Re-ping dec-004 for pipeline Stage 19 MCPs +- [ ] Implement Buddy's SEO suggestions (FAQ JSON-LD, hub page, GitHub README backlinks) +- [ ] Fix GitHub account flagging (submit support ticket when password is sorted) +- [ ] Check if Mac mini mouse is still frozen / BlueBubbles status + +### Context Future-Me Needs +- **GitHub is broken** — BusyBee3333 account flagged, can't push workspace. Password in 1Password is wrong. Email is jake@burtonmethod.com. +- **Upwork session died** — Brave restart killed cookies. Need to re-login before next proposal. +- **Robert Hartline** — this is our FIRST real Upwork lead. Follow up is critical. Nashville, CallProof, $164K client spend, 4.99 rating. +- **Connects:** 104 remaining. Cost ~$0.16 each. Buy more as needed. +- **Jake's vision:** 2-year freedom plan, learning stream tech is the big play. Everything we build should ladder up to this. +- **Compaction happened today** — memory was wiped mid-session. Anti-compaction protocol now in AGENTS.md. SAVE OFTEN. +- **Buddy (Eric's bot)** gave us genuinely good SEO advice. Implement the FAQ JSON-LD schema across all 70 landing pages — it's the highest ROI move. diff --git a/memory/upwork-pipeline-log.md b/memory/upwork-pipeline-log.md index 5a2ab05..9d6dc86 100644 --- a/memory/upwork-pipeline-log.md +++ b/memory/upwork-pipeline-log.md @@ -50,6 +50,9 @@ - Fit: PERFECT — multi-tenant SaaS, Next.js/TS/Postgres, AI workflows, document gen, compliance - URL: /jobs/CRM-SaaS_~022023092960523229697/ - Posted to Jake in #ai-tech-research + - **STATUS: ALREADY APPLIED** (proposal ID: 2023103056412270593, cost 25 connects) + - **WARNING:** Client avg pay $18.65/hr, previous hires at $6-15/hr. May lowball. + - Proposals jumped to 20-50 within 4 hours. Client last viewed 4 hours ago. ### The Lobster Capital job (Claude Code + OpenClaw) was already applied to. ### Summary diff --git a/nichequiz-app/app.py b/nichequiz-app/app.py new file mode 100644 index 0000000..e0febce --- /dev/null +++ b/nichequiz-app/app.py @@ -0,0 +1,929 @@ +""" +TheNicheQuiz.com — AI-Powered Niche Discovery for Health Insurance +Rebuilt Feb 15, 2026 — Healthy Self-Employed Focus + Nano Banana Pro Images +""" + +import os +import json +import csv +import io +import uuid +import time +from datetime import datetime +from functools import wraps +from pathlib import Path + +from flask import Flask, request, jsonify, render_template_string, redirect, url_for, session, make_response, send_from_directory +import psycopg2 +import psycopg2.extras +import bcrypt + +app = Flask(__name__) +app.secret_key = os.environ.get('FLASK_SECRET', 'nichequiz-secret-2026-feb') + +# --- Config --- +DB_NAME = 'nichequiz' +DB_USER = os.environ.get('DB_USER', 'jakeshore') +GEMINI_API_KEY = os.environ.get('GEMINI_API_KEY', 'AIzaSyClMlVU3Z1jh1UBxTRn25yesH8RU1q_umY') +IMAGES_DIR = Path('/Users/jakeshore/.clawdbot/workspace/nichequiz-app/generated-images') +IMAGES_DIR.mkdir(exist_ok=True) + +PORT = 8877 + +# --- Gemini Client --- +import google.generativeai as genai +genai.configure(api_key=GEMINI_API_KEY) +model = genai.GenerativeModel('gemini-2.0-flash') + +# --- DB --- +def get_db(): + return psycopg2.connect(dbname=DB_NAME, user=DB_USER, host='localhost', + port=5432, options='-c search_path=public') + +def login_required(f): + @wraps(f) + def decorated(*args, **kwargs): + if 'user_id' not in session: + return redirect('/login') + return f(*args, **kwargs) + return decorated + +# --- Image Gen (direct API, no subprocess) --- +def generate_ad_image(prompt, campaign_id): + """Generate an image using Gemini image model directly (no subprocess).""" + from google import genai as genai_new + from google.genai import types as genai_types + from PIL import Image as PILImage + from io import BytesIO + + filename = f"campaign-{campaign_id}-{uuid.uuid4().hex[:8]}.png" + filepath = IMAGES_DIR / filename + try: + client = genai_new.Client(api_key=GEMINI_API_KEY) + response = client.models.generate_content( + model="gemini-3-pro-image-preview", + contents=prompt, + config=genai_types.GenerateContentConfig( + response_modalities=["TEXT", "IMAGE"], + image_config=genai_types.ImageConfig( + image_size="1K" + ) + ) + ) + for part in response.parts: + if part.inline_data is not None: + image_data = part.inline_data.data + if isinstance(image_data, str): + import base64 + image_data = base64.b64decode(image_data) + img = PILImage.open(BytesIO(image_data)) + if img.mode == 'RGBA': + rgb = PILImage.new('RGB', img.size, (255, 255, 255)) + rgb.paste(img, mask=img.split()[3]) + rgb.save(str(filepath), 'PNG') + else: + img.convert('RGB').save(str(filepath), 'PNG') + print(f"Image saved: {filepath}") + return filename + print("No image in response") + return None + except Exception as e: + print(f"Image gen error: {e}") + import traceback; traceback.print_exc() + return None + +# --- CSS --- +CSS = """ +*{margin:0;padding:0;box-sizing:border-box} +:root{--bg:#0a0a0f;--surface:#12121a;--card:#1a1a2e;--border:#2a2a3e;--primary:#00d4aa;--primary-glow:#00d4aa33;--accent:#7c5cff;--text:#e8e8f0;--muted:#8888a0;--gold:#ffd700;--warm:#ff6b6b;--gradient:linear-gradient(135deg,#00d4aa,#7c5cff)} +body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;background:var(--bg);color:var(--text);overflow-x:hidden;line-height:1.6} +a{color:var(--primary);text-decoration:none} + +.hero{min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:2rem;position:relative;overflow:hidden} +.hero::before{content:'';position:absolute;top:-50%;left:-50%;width:200%;height:200%;background:radial-gradient(circle at 30% 50%,#00d4aa08 0%,transparent 50%),radial-gradient(circle at 70% 50%,#7c5cff08 0%,transparent 50%);animation:drift 20s ease-in-out infinite} +@keyframes drift{0%,100%{transform:translate(0,0)}50%{transform:translate(-2%,2%)}} +.hero-badge{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem 1rem;border-radius:99px;border:1px solid var(--border);background:var(--surface);font-size:.85rem;color:var(--primary);margin-bottom:2rem;backdrop-filter:blur(10px)} +.hero h1{font-size:clamp(2.2rem,5vw,4rem);font-weight:800;line-height:1.1;margin-bottom:1.5rem;background:var(--gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent} +.hero .subtitle{font-size:1.4rem;color:var(--warm);font-weight:600;margin-bottom:1rem} +.hero p{font-size:1.15rem;color:var(--muted);max-width:620px;margin-bottom:2rem;line-height:1.7} +.hero-cta{display:inline-flex;align-items:center;gap:.5rem;padding:1rem 2.5rem;border-radius:12px;background:var(--gradient);color:#fff;font-size:1.1rem;font-weight:600;border:none;cursor:pointer;transition:all .3s;text-decoration:none} +.hero-cta:hover{transform:translateY(-2px);box-shadow:0 8px 30px var(--primary-glow)} + +.section{padding:5rem 2rem;max-width:1100px;margin:0 auto} +.section-title{font-size:2rem;font-weight:700;text-align:center;margin-bottom:1rem} +.section-sub{text-align:center;color:var(--muted);margin-bottom:3rem;font-size:1.05rem;max-width:700px;margin-left:auto;margin-right:auto} + +.emotion-block{background:linear-gradient(135deg,#ff6b6b11,#7c5cff11);border:1px solid #ff6b6b44;border-radius:20px;padding:3rem;margin:2rem auto;max-width:800px;text-align:center} +.emotion-block h2{color:var(--warm);font-size:1.8rem;margin-bottom:1.5rem} +.emotion-block p{color:var(--text);line-height:1.8;font-size:1.05rem;margin-bottom:1rem} +.emotion-block .callout{font-size:1.3rem;font-weight:700;color:var(--primary);margin-top:1.5rem} + +.steps{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:2rem} +.step{background:var(--card);border:1px solid var(--border);border-radius:16px;padding:2rem;text-align:center;transition:all .3s} +.step:hover{border-color:var(--primary);transform:translateY(-4px)} +.step-num{width:48px;height:48px;border-radius:50%;background:var(--gradient);display:inline-flex;align-items:center;justify-content:center;font-weight:700;font-size:1.2rem;color:#fff;margin-bottom:1rem} +.step h3{font-size:1.15rem;margin-bottom:.75rem} +.step p{color:var(--muted);font-size:.95rem} + +.features{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:1.5rem} +.feature{background:var(--card);border:1px solid var(--border);border-radius:16px;padding:1.75rem;transition:border .3s} +.feature:hover{border-color:var(--primary)} +.feature h3{color:var(--primary);margin-bottom:.5rem;font-size:1.05rem} +.feature p{color:var(--muted);font-size:.93rem;line-height:1.6} + +.proof{display:flex;flex-wrap:wrap;gap:2rem;justify-content:center;margin-top:2rem} +.proof-stat{text-align:center;padding:1.5rem 2rem} +.proof-stat .num{font-size:2.5rem;font-weight:800;background:var(--gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent} +.proof-stat .label{color:var(--muted);font-size:.9rem;margin-top:.25rem} + +/* Auth */ +.auth-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:2rem} +.auth-card{background:var(--card);border:1px solid var(--border);border-radius:20px;padding:3rem;width:100%;max-width:420px} +.auth-card h2{text-align:center;margin-bottom:.75rem;font-size:1.8rem} +.auth-card .tagline{text-align:center;color:var(--muted);margin-bottom:2rem;font-size:.95rem} +.form-group{margin-bottom:1.5rem} +.form-group label{display:block;margin-bottom:.5rem;font-size:.9rem;color:var(--muted)} +.form-group input{width:100%;padding:.85rem 1rem;border-radius:10px;border:1px solid var(--border);background:var(--surface);color:var(--text);font-size:1rem;outline:none;transition:border .3s} +.form-group input:focus{border-color:var(--primary)} +.btn{width:100%;padding:1rem;border-radius:12px;background:var(--gradient);color:#fff;font-size:1rem;font-weight:600;border:none;cursor:pointer;transition:all .3s} +.btn:hover{transform:translateY(-2px);box-shadow:0 8px 30px var(--primary-glow)} +.auth-link{text-align:center;margin-top:1.5rem;color:var(--muted);font-size:.9rem} +.error-msg{background:#ff444422;border:1px solid #ff4444;border-radius:8px;padding:.75rem;margin-bottom:1rem;color:#ff6666;font-size:.9rem;text-align:center} + +/* Dashboard */ +.dash-header{display:flex;justify-content:space-between;align-items:center;padding:1.5rem 2rem;border-bottom:1px solid var(--border);background:var(--surface);position:sticky;top:0;z-index:100} +.dash-header h1{font-size:1.3rem;background:var(--gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent;font-weight:700} +.dash-nav{display:flex;gap:1.25rem;align-items:center} +.dash-nav a{color:var(--muted);font-size:.9rem;transition:color .3s} +.dash-nav a:hover{color:var(--primary)} + +/* Quiz */ +.quiz-container{max-width:720px;margin:3rem auto;padding:0 2rem} +.quiz-step{display:none} +.quiz-step.active{display:block;animation:fadeIn .4s ease} +@keyframes fadeIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}} +.quiz-step h2{font-size:1.7rem;margin-bottom:.75rem;text-align:center} +.quiz-step .step-desc{color:var(--muted);text-align:center;margin-bottom:2rem;font-size:1rem} +.options{display:grid;gap:.75rem} +.option{background:var(--card);border:2px solid var(--border);border-radius:12px;padding:1.15rem 1.25rem;cursor:pointer;transition:all .25s;font-size:.95rem} +.option:hover{border-color:var(--primary);transform:translateX(4px)} +.option.selected{border-color:var(--primary);background:var(--primary-glow)} +.option .opt-title{font-weight:600;margin-bottom:.2rem} +.option .opt-desc{color:var(--muted);font-size:.85rem} +.quiz-nav{display:flex;justify-content:space-between;margin-top:2rem} +.quiz-btn{padding:.85rem 2rem;border-radius:10px;border:1px solid var(--border);background:var(--surface);color:var(--text);cursor:pointer;font-size:.95rem;transition:all .3s} +.quiz-btn:hover{border-color:var(--primary)} +.quiz-btn.primary{background:var(--gradient);color:#fff;border:none} + +/* Campaigns */ +.campaigns-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:1.5rem;padding:0 2rem 2rem} +.campaign-card{background:var(--card);border:1px solid var(--border);border-radius:16px;overflow:hidden;transition:all .3s} +.campaign-card:hover{border-color:var(--primary);transform:translateY(-3px)} +.campaign-card img{width:100%;height:200px;object-fit:cover;border-bottom:1px solid var(--border)} +.campaign-card .card-body{padding:1.25rem} +.campaign-card h3{font-size:1.05rem;margin-bottom:.4rem} +.campaign-card .meta{color:var(--muted);font-size:.82rem;margin-bottom:.75rem} +.campaign-card .body-text{font-size:.9rem;margin-bottom:.75rem;line-height:1.5;color:var(--text)} +.campaign-card .tags{display:flex;flex-wrap:wrap;gap:.4rem;margin-bottom:.75rem} +.campaign-card .tag{background:var(--primary-glow);color:var(--primary);padding:.2rem .6rem;border-radius:99px;font-size:.75rem} +.campaign-card .cta-line{color:var(--accent);font-size:.85rem;font-weight:600} +.campaign-actions{display:flex;gap:.75rem;padding:1rem 1.25rem;border-top:1px solid var(--border)} +.campaign-actions button,.campaign-actions a{padding:.5rem 1rem;border-radius:8px;border:1px solid var(--border);background:var(--surface);color:var(--text);cursor:pointer;font-size:.85rem;transition:all .3s;text-decoration:none;text-align:center} +.campaign-actions button:hover,.campaign-actions a:hover{border-color:var(--primary)} +.campaign-actions .primary{background:var(--gradient);color:#fff;border:none} + +/* Loading */ +.loading{text-align:center;padding:4rem 2rem} +.spinner{width:40px;height:40px;border:3px solid var(--border);border-top-color:var(--primary);border-radius:50%;animation:spin 1s linear infinite;margin:0 auto 1rem} +@keyframes spin{to{transform:rotate(360deg)}} +.loading p{color:var(--muted);font-size:.95rem} +.loading .sub{font-size:.85rem;margin-top:.5rem;color:var(--accent)} + +/* Image generation status */ +.img-generating{background:var(--surface);border:1px dashed var(--border);border-radius:8px;height:200px;display:flex;align-items:center;justify-content:center;color:var(--muted);font-size:.85rem} + +@media(max-width:768px){ + .hero h1{font-size:2rem} + .steps,.features{grid-template-columns:1fr} + .proof{flex-direction:column;align-items:center} + .campaigns-grid{grid-template-columns:1fr;padding:0 1rem 1rem} + .dash-header{padding:1rem} + .quiz-container{padding:0 1rem} +} +""" + +# --- Health Insurance Segments (for self-employed healthy people) --- +SEGMENTS = [ + {"id": "aca-optimize", "title": "ACA Plans — Beat the System", "desc": "You make too much for subsidies but refuse to overpay. Find the gaps and loopholes."}, + {"id": "healthshare", "title": "Health Sharing Ministries", "desc": "Not insurance. Often cheaper. Community-based cost sharing for healthy people who think differently."}, + {"id": "shortterm", "title": "Short-Term & Bridge Plans", "desc": "Lean coverage for the gaps — between gigs, between plans, between life chapters."}, + {"id": "hsa-hdhp", "title": "HSA + High-Deductible Strategy", "desc": "Turn your health into a tax-advantaged wealth-building tool. Pay less now, invest the rest."}, + {"id": "supplemental", "title": "Supplemental & Gap Coverage", "desc": "Accident, critical illness, hospital indemnity — the safety net under the safety net."}, + {"id": "directprimary", "title": "Direct Primary Care + Catastrophic", "desc": "Skip the middleman. $80/mo gets you a real doctor. Pair it with catastrophic for the what-ifs."}, + {"id": "freelancer", "title": "Freelancer & Gig Worker Plans", "desc": "1099 life means you're the HR department. Find the plan that doesn't punish independence."}, + {"id": "group-of-one", "title": "Group Plans for Solo Businesses", "desc": "LLC or S-corp tricks that unlock group rates for a company of one. Legal. Smart. Underused."}, +] + +# --- Templates --- +def page(content, script=''): + return render_template_string( + '
' + '' + 'You didn't quit your 9-to-5 to hand $800/month to a system designed for someone else. Our AI finds the micro-niches where smart, healthy self-employed people are saving thousands — then builds you 10 ad campaigns to own that space.
+ Find My Niche — Free → +You built something from nothing. You bet on yourself when everyone said get a real job. You're crushing it — except for one thing.
+Every month, you write a check for health insurance you almost never use. No employer split. No subsidies. Just you, overpaying for a plan designed for someone with 3 chronic conditions and a corporate benefits team negotiating on their behalf.
+Meanwhile, there are millions of people just like you — healthy, self-employed, making good money — silently getting destroyed by a system that doesn't even know they exist.
+3 steps. Under 2 minutes. Walk away with 10 emotionally-charged ad campaigns + AI-generated visuals ready to launch.
+Choose from 8 health insurance strategies that actually work for healthy self-employed people — from HSA hacks to health sharing to group-of-one tricks.
+Our AI analyzes competition density and demand signals to find the most underserved micro-audiences — the specific people nobody is talking to.
+Emotionally-resonant ad campaigns with headlines, copy, targeting, and AI-generated ad images. One-click CSV export to Meta Ads Manager.
+Everything to launch a micro-niche health insurance ad campaign that actually makes people feel something.
+Not "self-employed health plans." Think "HSA-maximizing strategy for Austin-based Shopify store owners who run ultramarathons." That specific.
+Copy that makes healthy self-employed people stop scrolling. Speaks to the quiet frustration of overpaying. The pride of independence. The fear of what-if.
+Nano Banana Pro creates unique ad images for each campaign. No stock photos. No generic healthcare imagery. Real creative that matches your niche.
+One-click download formatted for Meta Ads Manager bulk upload. Quiz to running ads in under 10 minutes.
+Detailed buyer profiles — their daily life, what keeps them up at night about coverage, what they'd click on, what makes them trust you.
+Health insurance ad copy that respects CMS/state guidelines. No banned terms, no compliance headaches. Emotional but clean.
+Free. No credit card. Built by people who also overpay for insurance.
+Pick the health insurance strategy that resonates with your audience — healthy, self-employed people who refuse to overpay.
+ +Finding underserved sub-niches in ' + segmentTitle + '...
Error: ' + (data.error||'Unknown') + '
These are the underserved sub-niches where healthy self-employed people are being ignored.
Drilling into ' + subNicheTitle + '...
Error: ' + (data.error||'Unknown') + '
These people need to hear from you. Pick the one that lights you up.
Generating 10 emotionally-charged campaigns...
' + selections[0].title + ' → ' + selections[1].title + ' → ' + selections[2].title + '
'; + html += 'No campaigns yet.
Take the Quiz →{c['industry'] or ''} → {c['sub_niche'] or ''} → {c['micro_niche'] or ''}
+