Each claim ships with concrete evidence — env vars, table names, cadence chips. No marketing fluff.
◆DesignReal marketing site, mobile-first
Cut the under-construction WordPress and shipped a Next.js + Tailwind site with real sections: pricing, packages, calendar, booking. The Knot / WeddingWire / Thumbtack 5★ proof is on the page. Loads in under a second on a 4G phone.
- Before
- Single landing page with a hero, three placeholder boxes, and an under-construction banner.
- After
- Full booking funnel with a public calendar, transparent packages, and direct SMS opt-in.
- ▸Lighthouse 99/100 mobile (was 32/100 on the WP site)
- ▸TTFB 1.6s → 180ms p75
- ▸Real /pricing, /packages, /calendar surfaces (legacy had none)
◉RetentionSMS opt-in funnel + per-referrer QR codes
Every business card carries a unique /optin?ref=… link backed by a printable QR. Subscribers go through a TCPA-clean double-opt-in and land in Twilio. Repeat clients now get event-day reminders and post-event review nudges — without Jackie tapping a thing.
- Before
- Repeat clients had to text Jackie's personal cell.
- After
- Subscribers opt in once; the system handles event reminders + review requests on its own.
- ▸/optin double-opt-in (YES keyword flips consent to confirmed)
- ▸Per-card QR tracking — Jackie can see which gig drove which signups
- ▸Twilio inbound webhook flips STOP/HELP/YES automatically
△Agent backboneSEO agent backbone — posts ads while she sleeps
Python agent on the OpenClaw machine polls every 5 minutes via launchd. Queued tasks flow through Claude Haiku: scour local OC event-vendor pages, draft applications, draft outbound DM replies, refresh Google Business posts. Every outbound is a draft — Jackie approves before anything goes live (her explicit choice).
- Before
- Jackie scrolled IG hashtags between sets to find vendor calls.
- After
- Agent surfaces ranked opportunities each morning with pre-drafted applications.
- ▸5-min polling cadence, launchd-managed (no Cron drift)
- ▸Targets: Eventbrite OC vendor calls, Meetup events, IG hashtag scans
- ▸Draft-for-review — never auto-posts without Jackie's tap
△Agent backboneAuto-applies to be a vendor on scraped OC event pages
Same agent watches public Orange County event-listing surfaces — fairs, weddings expos, local-business mixers — extracts vendor application links, and queues a tailored application for Jackie to one-tap approve. She wakes up to a list of qualified gigs already drafted.
- Before
- Vendor opportunities slipped past during peak season — too many sites, no time.
- After
- Every public OC vendor call within 30 miles is surfaced + pre-drafted within an hour.
- ▸Per-event tailored cover note (uses Jackie's voice, not boilerplate)
- ▸De-dupes against already-applied events automatically
- ▸Surfaces in /dashboard with a single Approve → Submit button
▲Real-time pushReal-time inquiry push (PWA), not email
Every inbound — bid request, calendar question, review reply — fires a Web Push to Jackie's phone via her installed PWA. She taps the notification, the app opens straight to the relevant inbox thread. The old flow was email → maybe-check → maybe-reply-next-day.
- Before
- Inquiries arrived as email; replies came hours or days later, if at all.
- After
- Phone buzzes the moment a bid lands; Jackie can reply from the lock screen.
- ▸VAPID-signed web push (no app store, no FCM key shared upstream)
- ▸Average inquiry → notification: <30 seconds end-to-end
- ▸Tap-through deep-links to the exact inbox thread
◆DesignPuck visual editor wired to Postgres
/admin/edit is a real drag-and-drop editor (Puck) with 15 typed blocks — hero, services, calendar, reviews, the disco-ball accent, the parallax scene, the Instagram embeds row. Edits save as drafts and publish per page; every version is kept in Neon so a change can be rolled back.
- Before
- Copy changes meant a code edit + redeploy, every time.
- After
- Jackie (or Brendon) edits the live page visually; drafts publish without touching the repo.
- ▸15 Puck blocks in src/puck/config.tsx
- ▸puck_pages + puck_page_versions tables (draft/published per page)
- ▸Auth-gated — redirects to /dashboard/sign-in if not an owner
△Agent backboneTool-using chatbot for Jackie's dashboard
/dashboard/ai runs a real Anthropic tool-use loop (Sonnet, 6-iteration cap) over 8 hard-typed tools — it can search inquiries, pull a full client record, check the calendar for open weekends, draft a reply in Jackie's voice, and send it. Every send needs an explicit confirm and is audit-tagged in the messages table.
- Before
- Jackie re-read threads and hand-wrote every reply on her phone.
- After
- She asks for an inquiry in plain English; the bot finds it, drafts the reply, and sends only on her confirm.
- ▸8 tools: search_inquiries, get_inquiry, search_clients, draft_message, send_message, queue_long_task, check_calendar, generate_brochure
- ▸Sends require confirm:true and are tagged ai:chat:<email>
- ▸Errored tools return is_error so Claude can recover mid-loop
△Agent backboneSlack-as-frontend triage queue
A Vercel Cron polls #jackie-j-events every 5 minutes for /jj or @JACKIEBOT messages and pushes them into a deduped triage queue. An Anthropic classifier sorts each into one of 8 typed actions — swap a hero photo, update text, add an event, queue for research/dev — and a whitelisted few execute straight into the published Puck page; the rest wait for one-tap approval at /admin/queue.
- Before
- Quick-change requests lived in scattered texts and got lost.
- After
- A Slack message becomes a classified, approvable action — some apply themselves, the rest are one tap away.
- ▸triage_queue table with unique (source, source_ref) dedup index
- ▸8 typed action kinds → executor framework (swap_hero_photo + update_text write puck_pages.home.published)
- ▸LIVE_SAFE_WHITELIST gates auto-approval; everything else queues for Brendon
▲Real-time pushAdmin notification tree across 6 sources
The /dashboard sidebar carries an admin-only bell that aggregates six signals — Slack ingest, new inquiries, triage-queue activity, and more — on a 30-second poll, so nothing waits on someone remembering to check a tab.
- Before
- Status lived in N separate places; you found out when you looked.
- After
- One bell rolls up every operational signal the moment it lands.
- ▸6 aggregated sources, 30s poll, admin-only
- ▸Surfaces alongside the Web Push path, not in place of it
- ▸Built on the same Auth.js owner/allowlist role layer