Session state — gg-cabinet content engine
Picked-up-cold readable. Captures what's deployed, what works, what's pending, and where the next move is.
RELOAD ANCHOR (read this ALONE after a compaction)
- Brand rules:
wiki/business/brand-book/messaging.md(~4.7KB — read in full) - Photos:
wiki/content/photo_manifest.json(reference by id; do NOT re-read the 600-linegustavs-photo-library.md) - Build a carousel:
py -3 scripts/build_carousel.py wiki/content/specs/<spec>.yaml(spec = slug + per-slide kind/copy/emphasis/photo-id) - Canva: import the carousel PPTX, move design to folder
FAHKUT4tGpo - Verdicts to honor:
wiki/content/feedback.json— reuseused/keeppatterns, avoid anything markedcrap, follow the note text - Dashboard deploy:
py -3 scripts/build_dashboard.py --deploy(scp index.html+style.css to/var/www/test.messaging24.com/html/dashboard/) - Enhancement plan:
docs/superpowers/plans/2026-05-31-carousel-engine-enhancement.md
DAILY-DRIVER STACK — read this for the cabinet (added 2026-06-03)
The cabinet (gg.messaging24.com, Flask landing/cabinet-backend/app.py) is now a daily driver. Deploy = git push hetzner main (preserves only telos/state.json + inbox/). Engine + scripts live in scripts/ (deploy with the cabinet).
- THE morning brief =
scripts/daily_brief.py(Hetzner cron 06:30, sends to Telegram chatTELEGRAM_CHAT_ID=539850894 = Ansis). Unifies: Mayan energy + Scout 3+3 + funnel/ARR + clean priorities/decisions + a daily AI wisdom line.scripts/scout.pyruns 06:20 to feed it. The oldmorning_brief.pycron was replaced bydaily_brief.py. - Old gotauts stack repointed:
gotauts-telegram-bot+gotauts-agentscontainers had/vaultmounted to a frozen April copy (/opt/gotauts/telegram-bot/cabinet) — repointed to/opt/gg-cabinetso they read live data.bot.js's own 06:00 briefing is disabled (commentedscheduleDailyBriefing()+ rebuilt).docker-compose.ymlbacked up. - Mayan = vendored Node engine
scripts/tzolkin/(NOTgotautscom/tzolkin, which is untracked). Key fns:getDayForPerson,getTrecena/getTrecenaForGustavs(13-day operating cycle),getDeepReading/getDeepReadingForGustavs(deep day+wave+personal panels).scripts/mayan.pyshells in (subprocess cwd=scripts/, forceencoding="utf-8"or Windows breaks). Wavespell data vendored atscripts/tzolkin/vendor/wavespell-data.js. Tests:cd scripts/tzolkin && node --test index.test.js. /energy= deep daily+wave+personal read + 13-day cycle + Do/Avoid (day & wave). AI wisdom generated once/day → cachedinbox/energy/wisdom-<date>.txt(shared by/energy+ brief), prompt inscripts/energy_wisdom.py(Gustavs voice)./scout(Opportunity Scout): 3 competitors + 3 product/sourcing finds daily, steerable prefs/feedback underinbox/scout/. Core =scripts/research.py(Geminigoogle_searchgrounding) +scripts/scout.py. Clickable history/scout?date=YYYY-MM-DD.- CEO agent has a
research_webtool (grounded search + saves note toinbox/research/); is energy-aware in its context. /outreach=wiki/content/outreach.json(campaigns + warm + bounced + highlights). Stats are a coverage funnel: Targets · Approached · Emailed · Repeat · Replied · Bounced · No-email.- MCP (claude.ai connectors, attended sessions only): Gmail ✅ works; Shopify ❌ token expired (re-auth in
/mcpfor live sales); Canva/Klaviyo/Figma/GDrive also present. These CANNOT power the unattended 06:30 brief. - Python tests:
py -3 -m pytest tests/ scripts/tests/ -q(90 passing).
Session log: 2026-06-03 — cabinet became an autonomous daily driver
Massive build day. All deployed to Hetzner unless noted.
Shipped:
- ⑤ School Kit purge — D2 + P3 + GOALS milestone + all refs removed across 9 docs (incl. history). Deployed.
- ③ Morning brief — root cause: Gustavs's brief came from old bot.js reading a frozen April vault (still had D2). Repointed old containers to /opt/gg-cabinet, disabled bot.js brief, built daily_brief.py as the single autonomous briefer. Also fixed morning_brief.py HTML/400 bug earlier (HTML parse mode + _esc).
- ④ CEO agent writes — the 3 create-tools were self-calling CSRF-protected routes (403). Now write directly via _create_person/_create_idea/_append_decision. Deployed.
- ①② Mayan — energy engine (/energy), 13-day trecena operating-cycle, deep readings, daily AI wisdom, energy-log + check-in widget, CEO-agent energy-awareness.
- ⑥ Opportunity Scout — research core + research_web tool + daily scout + /scout page; cron 06:20.
- Outreach — added NYC-collab campaign (55 Gmail drafts for Jun 9–14 trip) + redesigned the stat funnel to coverage columns.
- eCOMHUB calendar removed (state.json + DEFAULT_CALENDARS + help text). eCOMHUB-the-business refs kept.
- Read Gmail via MCP: funding pipeline is hot (Tradewind positive, Clearco wants a Fri call, Storfund/Uncapped/SLR replied, $10M intake needs docs). Surfaced in the live briefs (msgs 254/260/262/264/265).
OPEN / next session:
1. Gmail App Password → /opt/gotauts/.env (GMAIL_USER+GMAIL_APP_PASSWORD) so the 06:30 brief includes inbox highlights without an attended session (hook already built in daily_brief.gmail_highlights).
2. ③A recipient — brief goes to Ansis (539850894). Switch to Gustavs once he taps Start on @gotauts_bot (tg bot work "tomorrow" per Ansis); then set his chat_id.
3. Shopify MCP re-auth → live sales analytics in the brief + fix stale current_arr €13M (real ≈ $3M+/mo).
4. Funding — offered: draft Clearco/Storfund replies (Gmail create_draft) + a consolidated data-room checklist (bank statements, 2024/25 returns, 2025 YTD P&L+BS).
5. Scout competitor extraction sometimes returns 0 (grounded JSON parse) — hardening fast-follow.
6. Deploy-clobber (latent): agent/bot writes to tracked wiki//telos/ are reset on deploy; only state.json+inbox/ survive. Live data lives under inbox/.
Phase 0 verification (2026-05-31, feature/carousel-engine-enhancement)
Verified by reading the real files (several audit claims were stale):
- build_dashboard.py = 901 lines, ONE render_dashboard (727) + ONE main (872). No triplication. Cards built by render_drafts (~445) as <details class="draft-detail"> — NO verdict UI yet, NO data-slug.
- Deploy = scp -r index.html style.css (NOT rsync --delete). gg-funnel app source = landing/funnel-backend/app.py.
- content_agent_run.py = no random.choice; selection is curated (do NOT add stochastic selection).
- Canva permission spike (Task 0.5) — OPEN, manual for Ansis: set folder FAHKUT4tGpo share to "anyone with link → can edit", push one design in, check if the contained design inherits "anyone with link". Record canva-inheritance: holds | no-api here. Gates whether Phase 4 Canva autonomy is reachable.
Session log: 2026-05-14 — Personal AI OS shipped (gg.messaging24.com)
The day's milestone: gg.messaging24.com is live as Gustavs's Personal AI OS — Morning Briefing dashboard with live data + working CEO Agent backed by Gemini + Google Calendar integration + cabinet→Hetzner git auto-sync.
Shipped today
The cabinet itself — gg.messaging24.com:
- Flask app at landing/cabinet-backend/, port 5002, nginx vhost + LE cert, systemd gg-cabinet.service. Mobile-first navy/gold UI lifted from CEOPIT/GustavsAIOS-DemoUI.html.
- Pages: Morning Briefing (/), Goals & Missions (/goals), Calendar (/calendar), All Files (/files + /files-ggim), Business (/business), Ideas (/ideas), People (/people), Decisions (/decisions), AI Agents (/agents), Gmail (/gmail), Telegram Bot (/telegram), TELOS Files (/telos), Inbox (/inbox), File viewer (/file?path=…), Markdown editor (/edit?path=…).
- Sidebar reshuffled: Overview (Morning Briefing · Goals · Calendar) — Knowledge Base (All Files · Business · Ideas · People · Decisions) — OS Core (AI Agents · Gmail · Telegram Bot · TELOS Files) — Content Engine (@gotauts Dashboard ↗).
- Build marker bottom-left sidebar so cache state is verifiable.
Morning Briefing content: - Today's Kin (from Node tzolkin engine) - 📅 Today's calendar events row — pulled from iCal feeds with 30-min cache - 🎯 Top priority (parsed from GOALS.md milestones, first 🔴 status) - ⚠️ Open Loops (first 3 from DECISIONS.md, "+ N more →" if more) - 📱 Carousel engine status (N drafts / saved / tests, link to @gotauts dashboard) - 📖 Brain Food card (side-by-side with 260-Day Mission): daily quote rotation (30 quotes from Bezos / Jobs / Munger / Naval / Ravikant / Voss / etc.) + daily technique rotation (20 frameworks each with attribution + when-to-use + verified Read more → link) - 260-Day Mission card: ARR progress bar (gold, €13M / €100M = 13%) + time-elapsed bar + 5 milestones from GOALS.md - Alerts banner — only renders when something's broken (cron missed, key missing, carousel empty)
Goals editor (/goals):
- Big ARR hero card with inline edit form (sets current_arr + target_arr in telos/state.json)
- Milestones table from GOALS.md as inline-editable rows: status dropdown (saves on change), label + deadline inputs (save on blur), delete button per row, add-new form at bottom
- API endpoints: POST /api/arr, POST /api/milestone/new, POST /api/milestone/{idx}/update, POST /api/milestone/{idx}/delete
Calendar (/calendar):
- 3 calendars pre-seeded in state.json: eCOMHUB · Yourgreenhouses · Personal (Gustavs's Gmail). All as Google Calendar iframe embeds.
- Inline form to add/remove calendars. State persists in telos/state.json under calendars.
- iCal feeds parsed server-side for the morning brief's "📅 Today" row (private calendars 404 → silently skipped, public ones surface)
CEO Agent — live, Gemini-backed, 9 tools:
- Backend: gemini-2.5-flash via Google's generateContent API. Reuses existing GEMINI_API_KEY in /opt/gotauts/.env.
- Pre-loaded cabinet context in every request: Day N/260 + Kin + ARR + carousel status + today's events + open decisions + made decisions + recent ideas + MISSION.md + GOALS.md excerpts. Agent answers strategy questions instantly without read_file calls.
- 9 tools available: add_person, update_person, delete_person, add_idea, log_decision, complete_decision (smart-match by D-label or title substring), set_arr, search_wiki (greps wiki/ + telos/), read_file (sandboxed)
- Right-column chat input on every page. Captures raw message to inbox first (failsafe), then runs agentic loop up to 4 rounds.
- Voice button (hold-to-record) → POST /capture/audio → saves webm/ogg + transcript when OPENAI_API_KEY set, else pending stub.
Knowledge base (wiki/) content created or expanded:
- wiki/business/_index.md — three-businesses overview (YGH + eCOMHUB + @gotauts) with AI-implementation cross-ref
- wiki/business/ai-implementation.md — exhaustive state-of-AI doc, kept current
- wiki/founder/ — 9 files: founding-story (15-year father arc + Europe/US gap context) · timeline · quotes (42 verbatim) · anecdotes (20 recurring) · numbers · visual-broll · philosophy · gaps · _index
- wiki/content/viral-mechanics.md — 12 rules + retention math distilled from research/
Cabinet → Hetzner auto-sync:
- Bare repo at /opt/gg-cabinet.git + post-receive hook on Hetzner
- Local git remote hetzner at ssh://root@204.168.179.124/opt/gg-cabinet.git
- git push hetzner main = full deploy. Hook preserves state.json + inbox/ + .venv/ + outputs/ + GGim/ across deploys
- Full docs in ops/DEPLOY.md
- telos/state.json and inbox/ now .gitignored so my pushes never overwrite user data
Morning brief cron (Telegram, separate from web cabinet):
- scripts/morning_brief.py — daily 06:30 Riga cron on Hetzner. Pushes Kin + last-24h leads + top draft + Canva link to Gustavs's Telegram chat (reuses gotauts-telegram-bot token).
Open follow-ups (in priority order — pick up next session)
- Wire today's calendar events into the Telegram brief — cron version still shows just Kin + leads + draft. Same iCal feed function exists, just need to call it from morning_brief.py.
- Pass 2: AI research prompt generator for decisions — when you log a decision, button to have Gemini draft a tailored research prompt. Track this against task #19.
- CEO Agent: voice in/out — voice button captures + saves but doesn't speak back. Needs OPENAI_API_KEY for Whisper + a TTS endpoint (ElevenLabs / Google / OpenAI TTS).
- Streaming responses — agent replies all-at-once today. SSE/streaming would feel snappier.
- Tighter Gustavs-voice in system prompt — load top quotes from
wiki/founder/quotes.mdinto context. Currently has 5 inline principles. - Knowledge Compiler — cron that processes
/opt/gg-cabinet/inbox/files, classifies via Claude Haiku (or Gemini), routes into the right wiki folder. - Gmail integration —
/gmailis a placeholder with the safety-first design doc. Wire it with App Password + IMAP + strict deny-list. - Market Scout — watches competitors (GreenDome etc.) on a schedule, surfaces signals.
- Pre-existing follow-ups from 2026-05-13 still open: email provider (Resend), sending domain verification, Loom walkthrough, ManyChat wiring, image-gen MCP for R4 wealth-style, content-engine cron + button (Phase 2 #2 + #4).
Live state on Hetzner
- Cabinet service:
gg-cabinet.service, systemd, port 5002, healthy - Public URL:
https://gg.messaging24.com/(Let's Encrypt cert, auto-renew) - ARR: €13M of €100M (13%) in
telos/state.json - 3 calendars in state.json (eCOMHUB · YGH · Personal)
- 4 inbox captures + 26 carousel drafts
- 2 made decisions (D1), no open decisions
GEMINI_API_KEYconfirmed live in/opt/gotauts/.env(loaded into gg-cabinet's systemd env)- Build marker
1500+(changes per restart) - All Phase-1 follow-ups from 2026-05-13 still relevant, plus the new ones above
Resumption protocol — next session
- Drop into chat:
Resume from ops/session-state.md - Confirm the cabinet still loads:
curl -s -o /dev/null -w '%{http_code}\n' https://gg.messaging24.com/ - Pick the next follow-up — probably #1 (today's events in Telegram brief) or #2 (decision research prompt).
- Deploy is one command:
git push hetzner main.
Session log: 2026-05-13 — viral aesthetics + dashboard restructure
Shipped today
Photo automation:
- wiki/content/gustavs-photo-library.md — 75 photos in GGim/Pictures/ tagged by 5 parallel vision subagents. 27 usable (gustavs-solo / with-audience), 48 excluded. last_reviewed_by: gustavs.
- scripts/pick_photo.py — scoring picker. CLI + library. Reads catalog, scores entries against archetype (A1/A2/A3/A6) + mood_hint + headline-zone + emphasis-color compatibility.
- render_carousel.py + render_carousel_pptx.py support BACKGROUND_IMAGE: auto plus ARCHETYPE_HINT + MOOD_HINT slide fields.
Composites:
- scripts/compose_cover.py — viral composite generator (before/after, triptych, 2x2 grid, diagonal). PIL-only, no image-gen MCP needed. Demos in outputs/composites/.
Viral aesthetics (3 + 4 + 5 = 12 new carousels pushed today):
- scripts/viral_covers.py — covers, body slides, CTAs for 8 distinct styles total:
- v1: magazine (FOUNDER mock), screenshot (Stripe/iMessage cards), newspaper (THE FOUNDER halftone)
- v2: twitter thread, document (annotated ledger), notebook (yellow legal pad), quote (Naval-style typography), polaroid (kraft corkboard photo dump)
- scripts/build_viral_carousels.py — content + render pipeline for the original 7 (c1-c7)
- scripts/build_viral_v2_carousels.py — content + render pipeline for the new 5 (c1-c5)
- scripts/assemble_viral_pptx.py — wraps image-only slides into a PPTX (no native text frames; design IS the message)
Dashboard restructure:
- New sections: Tests (default, ~22 entries) and Our Saved Concepts (promotion via saved: true frontmatter flag — currently empty by design)
- private? warn badge on every Canva link until canva_link_public: true flag is set in draft frontmatter
- Persistent Canva-share callout in Saved Concepts section
- KPI base flipped: "Drafts in pipeline" → "Saved concepts"
- cover_image_path frontmatter override so viral-test JPGs at outputs/viral-tests*/c*-*/slide-01.jpg resolve cleanly
- Both PNG and JPG covers supported
Bulletproof renderer:
- render_carousel_pptx.py cover text frame extended from 460px → 880px (bottom-anchored, y=120, h=880). Fixes the H8-v3-style Canva-import cropping. Hook covers also get a word-count warning above 12 words.
Canva infrastructure
- Shareable folder created:
FAHJiE-eEZM("@gotauts — public-edit (gg-cabinet pushes)") — https://www.canva.com/folder/FAHJiE-eEZM - All 19+ recent designs auto-moved into the folder via
move-item-to-folderMCP calls - Open hypothesis: Canva folder-permission inheritance onto contained designs — Gustavs needs to test once (set folder share to "anyone with link → can edit", then verify a contained design now says "anyone with link"). If inheritance works, every future push is born public. If not, the folder still centralizes for fast manual flipping.
Workflow rules now in effect (memory-backed)
- Every
import-design-from-urlpush MUST follow up withmove-item-to-folder→FAHJiE-eEZM. - Surface the per-design URLs + manual share-flip instruction in the response message to Ansis after every push.
- After Ansis flips share permission, he adds
canva_link_public: trueto the draft frontmatter so the dashboard badge clears.
See: ~/.claude/projects/.../memory/feedback_canva_pushes.md for the canonical rule.
Saved memories added this session
gustavs_photo_library_and_picker.mdcompose_cover_viral_composites.mdfeedback_canva_pushes.md(expanded with the folder-auto-move workflow)viral_covers_test.md
Open follow-ups (in priority order)
- Verify Canva folder-permission inheritance — Ansis tests on folder
FAHJiE-eEZM. If it works, every future push is automatically public. - Promote keepers from Tests → Saved Concepts — Ansis reviews the 22 tests, marks winners with
saved: truein frontmatter, redeploys dashboard. - First in-market carousel post — pick from the v2 viral set or the Caleb-pattern H5/H8 set, post on @gotauts, gather performance data.
- Sync
cover_image_pathreview with Gustavs — he hasn't seen the 5 v2 styles yet (twitter / document / notebook / quote / polaroid). Schedule a 10-min walkthrough. - Existing follow-ups unchanged from prior sessions: email provider for
gg-funnel, Loom walkthrough, ManyChat NUMBERS wiring, image-gen MCP for R4 wealth-style (now partially solved by compose_cover.py for personal-arc composites — full wealth-grid still pending).
What's running in production
Hetzner box 204.168.179.124 (cpx22, Ubuntu 24.04)
- SSH as
root(key-auth from this Windows machine works) nginx1.24 with 3 sites:gotauts(proxy to localhost:3000 — gotauts-cabinet Next.js app)yourgreenhouses(proxy to localhost:8501)test.messaging24.com(static + /api/ proxy + /dashboard/)certbot2.9 — Let's Encrypt cert for test.messaging24.com auto-renews- 3 Docker containers (existing, unrelated to engine):
gotauts-cabinet(Next.js admin UI — separate project, port 3000)gotauts-agents(FastAPI — port 8000)gotauts-telegram-bot- 1 systemd service we own:
gg-funnel— Flask app at/opt/gg-funnel/app.py, port 5001 (not exposed; nginx proxies /api/ to it)
Public URLs (test.messaging24.com)
| URL | Purpose | Status |
|---|---|---|
https://test.messaging24.com/ |
NUMBERS form landing page | live |
https://test.messaging24.com/tracker/ |
tracker preview page | live |
https://test.messaging24.com/tracker/tracker.xlsx |
Excel template download | live |
https://test.messaging24.com/api/numbers |
POST endpoint for form submits | live |
https://test.messaging24.com/api/health |
health check | live |
https://test.messaging24.com/dashboard/ |
content engine dashboard (no auth currently) | live |
Server-side files (Hetzner, paths to remember)
/opt/gg-funnel/app.py— Flask backend/opt/gg-funnel/.venv/— Python venv with Flask installed/opt/gg-funnel/leads.md— canonical lead capture file (synced to local on dashboard build)/opt/gg-funnel/email-queue.jsonl— emails queued because no provider yet/etc/systemd/system/gg-funnel.service— systemd unit/var/www/test.messaging24.com/html/— static web root/etc/nginx/sites-available/test.messaging24.com— nginx vhost (HTTPS via certbot lines)/etc/nginx/.htpasswd-dashboard— dashboard basic auth (currently NOT enforced)
DNS
test.messaging24.comA record →204.168.179.124(Namecheap cPanel zone editor for messaging24.com)messaging24.comzone hosted ondns1/dns2.namecheaphosting.com- Hetzner local DNS cache flushed once during DNS work; future flush via
systemctl restart systemd-resolved
Approval state — Gustavs has signed off on
11 cabinet files flipped from last_reviewed_by: pending-gustavs to gustavs (commit see git log). Files: brand-book/{about,icp,offers,messaging}.md, hooks.md, archetypes.md, prompt.md, content-engine.md (SOP), and the 3 freebie/* files.
Brand book is locked. Visual references locked. Voice DNA locked.
Visual references catalog (wiki/content/visual-references.md)
- R1 — Caleb Watson ("I BEAT CANCER 3 TIMES") — personal arc + cover-dominant + restraint. Implementable now: photo full-color, ALL CAPS bottom-anchored headline, lime emphasis, black stroke for legibility, vertical gradient on bottom half. Confirmed in production renderer (PIL + PPTX both updated).
- R2 — AJ Ellison (IFBB pro at 50) — authority + specific count + trust-hack. Same renderer as R1.
- R3 — Gustavs's own ($1M+ MONTH) — receipt-driven A1 archetype.
- R4 — @wealth grid — composite-imagery + bottom yellow headline. NOT implementable yet: requires AI image generation (Codex CLI / GPT-Image-1 / Midjourney) for multi-photo composites. Phase-2 task. ~4–6 hours integration when ready.
Hook batches generated
wiki/content/drafts/queue/proposed-hooks-2026-05-05.md— batch 1, 7 hooks, 7 of 8 formulas (skipped H5)wiki/content/drafts/queue/proposed-hooks-2026-05-06.md— batch 2, 7 hooks, includes H5 first-test. First batch reading visual-references.md.
Both batches: mix 2/4/1 (Validator/Operator/Scaler), within ±10pt of 30/50/20 target.
Carousel drafts expanded
| Draft ID | Hook | Persona | Slides | Canva v2 (current) | Canva v1 (dimmed, archived) |
|---|---|---|---|---|---|
| 2026-05-05-h1-bad-day-narrative | H1 | Operator | 8 | https://www.canva.com/d/MyVRhpiwA9Rqs72 | https://www.canva.com/d/ToXeOQxN2TqTXFh |
| 2026-05-05-h1-bad-day-narrative-receipts | H1 | Operator | 8 | https://www.canva.com/d/OmrYdgHQ_nkU5fM | https://www.canva.com/d/LFpOs8kLs0E-Oks |
| 2026-05-06-h5-discounts-vs-aov | H5 | Operator | 7 | https://www.canva.com/d/T9lKnXX2dGtXFkP | https://www.canva.com/d/98etz_SZt_NrH0a |
| 2026-05-06-h8-cashflow-not-roas-protocol | H8 | Operator | 8 | https://www.canva.com/d/JltNuDfQsYz9QXh | https://www.canva.com/d/XYdmFwP4VNOlYvH |
H5 + H8 are the strongest Caleb-pattern fits and the recommended "ship first" picks once we go live on @gotauts.
Pending decisions (open gates)
| Gate | Owner | Action | Blocks |
|---|---|---|---|
| Email provider | Gustavs/Ansis | Pick Resend or other, get API key, add as RESEND_API_KEY to gg-funnel.service env |
Real emails sending. Currently queued to /opt/gg-funnel/email-queue.jsonl. From-address placeholder: gustavs@gotauts.com. |
| Verify sending domain | Ansis | Add Resend DNS records to gotauts.com (or messaging24.com) | Email deliverability |
| Loom walkthrough | Gustavs | Record 90-sec walkthrough of the tracker; URL → wiki/content/freebie/numbers-tracker.md loom_walkthrough_url |
Better UX in tracker preview page (pasted into landing/tracker/index.html LOOM_URL_PLACEHOLDER) |
| First carousel post | Ansis | Export H5 or H8 from Canva v2 → schedule via Meta Business Suite | First real lead, first perf data |
| ManyChat (last) | Ansis | Wire NUMBERS comment trigger → /api/numbers POST | Auto-DM funnel automation |
| Image-gen MCP | Ansis | Pick image-2.0 provider; add MCP integration | Wealth-style (R4) carousels, A6 archetype |
Phase 2 build queue (when ready, in order)
- Sync cabinet to Hetzner — git remote on Hetzner, so dashboard build can run server-side via cron
- Cron the dashboard build — every 5 min, no more manual
--deploy - Cron the perf pull —
scripts/meta_insights_pull.pynightly via Hetzner cron once we have IG posts to pull from - Dashboard "Generate next batch" button — small Flask endpoint on Hetzner that runs
content_agent_run.pyserver-side; cabinet on Hetzner; ANTHROPIC_API_KEY in env. ~50 min build. - Image-gen MCP for R4 wealth-style. ~4–6 hours.
- Approval workflow buttons in dashboard — flask endpoints to flip frontmatter, commit, refresh. ~45 min.
Local commands cheatsheet (for resumption)
# From the cabinet root, refresh dashboard from current state
py -3 scripts/build_dashboard.py --deploy
# Generate a new hook batch (needs ANTHROPIC_API_KEY)
ANTHROPIC_API_KEY=sk-ant-... CABINET_PATH=. py -3 scripts/content_agent_run.py
# Render a draft to PNG previews
py -3 scripts/render_carousel.py wiki/content/drafts/<draft_id>.md
# Render a draft to editable PPTX (push-to-Canva ready)
py -3 scripts/render_carousel_pptx.py wiki/content/drafts/<draft_id>.md
# Bundle PPTX + upload to catbox (gives public URL for Canva import)
curl -sS -F "reqtype=fileupload" -F "fileToUpload=@<path-to-pptx>" https://catbox.moe/user/api.php
# SSH to Hetzner
ssh root@204.168.179.124
# Tail funnel backend logs
ssh root@204.168.179.124 'journalctl -u gg-funnel -f'
# Tail nginx access log for tracker downloads
ssh root@204.168.179.124 'tail -f /var/log/nginx/test.messaging24.com.access.log'
Spec + plan locations
- Spec:
gotautscom/docs/superpowers/specs/2026-05-05-gotauts-content-engine-design.md - Plan:
gotautscom/docs/superpowers/plans/2026-05-05-gotauts-content-engine.md
(Both in the gotautscom/ inner git repo, not the gg-cabinet outer one.)
Resumption protocol for the next Claude session
When you start a new session, drop this into the first message:
Resume from
ops/session-state.md. Read it before responding. Then we continue.
That + claude --continue should pick up cleanly. If --continue history is lossy, the session-state file is sufficient on its own.