This file is the source of truth for what's been done, what's in progress, and what's next. If Benny gets rate limited or compacted, read this file first to resume.
Issue: Worker is the engine — if it dies silently, articles stop generating. Need monitoring, auto-restart, and structured logging.
- Task 1: Health check endpoint —
GET/POST /api/worker/health, worker pings every 60s, stores in MongoDB (commit72873e7) - Task 2: Process watchdog script — OpenClaw cron every 2 min, auto-restart on crash (commit
987a498)⚠️ TEMPORARY — will be replaced by systemd on AWS - Task 3: Structured event logging — PAUSED, will implement on Linux VM with journald
- Task 4: Graceful shutdown + crash recovery — PAUSED, will implement with systemd SIGTERM
- Task 5: Basic alerting — PAUSED, will implement on Linux VM
Decision: Move worker to AWS EC2 (t3.small, us-east-1). systemd replaces watchdog, journald replaces log files.
- Apply for AWS Activate Founders credits ($1K) — submitted Mar 7
- AWS account created: tryscribeco (092042969558), root MFA enabled
- IAM Identity Center enabled (us-east-1, permanent)
- AdminGroup + AdministratorAccess permission set created
- User taha (taha@tryscribe.co) created, added to AdminGroup
- Permission set assigned to tryscribeco account
- Access Portal URL:
https://d-906605d2b0.awsapps.com/start - AWS CLI v2 installed + SSO configured (profile:
scribe-admin) - Workloads OU created (
ou-uj2a-yibjo9fm) - Scribe Production account created (
572885593715) - CloudTrail protection SCP attached to Production
- $150/mo budget with alerts (80% actual + 100% forecast) → taha@ + dev@ + finance@tryscribe.co
- Full Phase 5 verification passed
- Earn extra $100 credits — Complete onboarding activities
- Provision EC2 instance — i-025c8a724390b03d1, t3.small, Ubuntu 24.04 x86_64
- Elastic IP: 13.216.237.65, SSH config:
ssh scribe-worker - Security group: sg-0f50a0862e7bb4e21 (SSH only)
- Server hardening — fail2ban, UFW, key-only SSH, auto security updates, timezone MST
- Node.js 22.22.1 installed
- Repo cloned to /home/ubuntu/scribe, npm install complete (136 packages)
- Env file at /etc/scribe/.env (root:root, 600) — MongoDB, OpenAI, Blob, Resend, worker secret
- OpenClaw v2026.3.2 installed, PATH added to ~/.bashrc
-
openclaw onboardcompleted — Anthropic auth (setup-token), claude-opus-4-6, no channels, no skills - Hooks enabled: command-logger + session-memory (compaction resilience for multi-article runs)
-
openclaw doctorpasses clean — no blockers - RESOLVED: OpenClaw gateway service on EC2
openclaw gateway installfails over SSH (known edge case — systemctl --user detection)- Solution: Created system-level systemd service (
/etc/systemd/system/openclaw-gateway.service) - Runs
openclaw gateway run --bind loopback --port 18789(matches docs pattern from Hetzner guide) - Includes performance optimizations: NODE_COMPILE_CACHE, OPENCLAW_NO_RESPAWN=1
- Service enabled, started, verified: RPC probe OK,
openclaw healthpasses - Docs reviewed: remote access, exe.dev, Hetzner/Docker guides — all confirm this approach
- Initial workspace files deployed (SOUL.md, AGENTS.md, IDENTITY.md, TOOLS.md, USER.md, HEARTBEAT.md)
- Scribe Walker Agent Architecture Review — COMPLETE (Mar 7-8)
- Architecture doc expanded:
platform/docs/ARCHITECTURE.mdwith full agent design, decisions, diagrams - Three-way comparison posted to GitHub issue #40 (Mac prototype vs EC2 production)
- Full analysis of Mac Mini Walker Posse architecture
- Transcribed and analyzed Taha's 10-min voice memo on design philosophy
- 22-point SEO quality checklist:
platform/docs/SEO-QUALITY-CHECKLIST.md - Decision: Scribe Walker = main agent on EC2 (full OpenClaw lifecycle)
- Decision: Prompt modules in JS files, not MongoDB — security > hot-reload
- Decision: Agent is stateless — no persistent memory across jobs
- Decision: DB stores DATA, JS stores RULES
- Architecture doc expanded:
- Worker routing (#67) — COMPLETE (Mar 8)
WORKER_TARGETenv var:ec2(default) orlocal(Mac Mini)- EC2 picks up
{ status: "pending", worker: { $ne: "local" } } - Mac Mini picks up
{ status: "pending", worker: "local" }only - Generate API accepts
?worker=localquery param - Job model:
workerfield (enum: ec2|local), compound index updated - Scroll Worker bumped to v0.2.0
- Git tag
mac-mini-worker-snapshotfor rollback safety - Commit:
46d71f0
- EC2 agent configuration — COMPLETE (Mar 8)
- Agent ID configurable via
AGENT_IDenv var (default:main) - Tool profile:
full(notmessaging— agent needs exec/read/write) - Exec security:
fullwith askoff(headless server, no companion app) - Unique session ID per job:
scribe-job-{jobId}-{timestamp}(prevents history carryover) - OpenAI key in
openclaw.json(matches Mac Mini extraction pattern) - SCRIBE-WALKER-CONTEXT.md deployed (production version, no Taha-specific content)
- MongoDB credentials at
~/.openclaw/credentials/mongodb-scribe.json
- Agent ID configurable via
- EC2 end-to-end testing — COMPLETE (Mar 8)
- 3 successful article generation runs (9 articles total)
- DALL-E image generation + CDN upload working
- Completion email notifications working
- Dedup against existing titles working (checked 58-64 titles per run)
- Average 1,800-2,000 words per article
- ~4-6 min per 3-article batch
- Image padding detection (#69) — COMPLETE (Mar 8)
- 3-layer detection in
image-processor.ts:- Square/portrait:
width ≤ height - Solid padding: 20px scan → 100px confirmation, any color
- Soft padding: uniform edges + edge-vs-center color distance > 40
- Square/portrait:
- Tested against 5 flagged images — catches black, cream, peach padding
- Verified no false positives on valid spa interior images
- Auto-queues regeneration job on rejection
- Commit:
82cae53
- 3-layer detection in
- Services deployed on EC2 (Mar 7-8)
openclaw-gateway.service— systemd, loopback:18789, RPC OKscribe-worker.service— systemd, polls MongoDB, spawns agent sessions- Both services running, auto-restart on failure
- Cutover Step 2: Mac Mini comparison test — COMPLETE (Mar 8)
- True end-to-end test via Summon button with
?worker=local - Snapshot code: avg 1,392 words / 6.2 min
- EC2 production: avg 1,933 words / 7.2 min
- EC2 wins on content depth (39% more), both pass quality gates
- Comparison posted to GitHub issue #40
- True end-to-end test via Summon button with
- Cutover Step 2.5: Production hardening (Mar 8)
- Word count ceiling: 1,400-1,700 target, 1,900 max
- DALL-E demographic fix: prefer no-people images (DALL-E overrides ethnicity prompts)
- README: comprehensive with mermaid diagrams, troubleshooting flowchart, ops guide
- Accidental snapshot commit caught and fixed (job-worker.js)
- Mac Mini watchdog cron deleted (no longer needed)
- Test accounts standardized: dev+test1-7@tryscribe.co
- Vercel platform deploy: manual CLI only (NOT auto-deploying on push)
- ⏳ Cutover Step 3: 24h monitoring — IN PROGRESS (started Mar 8, 2032 MDT)
- EC2 is sole production worker
- Mac Mini workers killed, snapshot tag preserved for rollback
- Hasnat (@Crypto_naka09) conducting external testing
- Taha testing across multiple accounts/niches
- ⏳ Cutover Step 4: Decommission Mac Mini worker — after monitoring passes
- Complete Tasks 3-5 properly on Linux (structured logging, graceful shutdown, alerting)
- Remove Mac watchdog cron, cleanup
- #67 Worker routing — CLOSED (implemented)
- #68 Browser 'Leave site?' popup contradicts 'Safe to leave' messaging — OPEN
- #69 DALL-E image padding detection — CLOSED (3-layer detection implemented)
Issue: Site owners need to manage their own articles — delete, regenerate images, upload custom images, edit metadata, unpublish.
- Task 1: Delete article —
DELETE /api/articles/[id], ownership verification, Blob cleanup. Committed:14e0961 - Task 2: Regenerate featured image — async via worker job queue, DALL-E 3 → sharp Q85 → Blob CDN. Committed:
059e452 - Task 3: Upload custom image —
POST /api/articles/[id]/upload-image, 5MB max, sharp Q85 pipeline. Committed:c994f9f - Task 4: Edit article metadata — title, SEO title/description/keywords, modal UI. PAUSED — awaiting discussion
- Task 5: Unpublish/republish toggle —
PATCH /api/articles/[id]/status, draft ↔ published, auto-unpin. Committed:c994f9f - Task 6: Card clutter cleanup — stripped action buttons from cards, pencil ✏️ icon → manage modal with all actions. Committed:
20bd01e,62ec67e - Task 7: Graceful "not available" page — branded page instead of 404, suggested articles, blog home CTA. Committed:
4481ad2
- Dashboard now polls during image regeneration (was only polling during article generation). Committed:
75b1ee7 - Image-regen email notifications fixed (was using
articleIdsinstead ofarticleId). Committed:75b1ee7 - Toast notifications on regenerate/upload. Committed:
2f29fdd
Issue: All 57+ featured images stored as base64 in MongoDB (~1MB each, ~57MB total). No compression, no CDN.
Approach: Keep DALL-E 3 at 1792x1024 → sharp JPEG Q85 compression → Vercel Blob CDN → store only URL in MongoDB.
- Task 1: Install sharp + @vercel/blob, connect Vercel Blob store (
scribe-images, iad1), BLOB_READ_WRITE_TOKEN set - Task 2:
src/lib/image-processor.ts—processAndUploadImage()+processBase64AndUpload(), tested - Task 3:
POST /api/images/uploadendpoint — worker calls this with DALL-E URL, compresses + uploads + updates article - Task 4: Worker updated — passes DALL-E URL to upload API, no more base64 storage
- Task 5: Migration complete — 63/63 articles migrated to Vercel Blob CDN, 0 errors, 56% avg compression
- Task 6: Image route updated — 301 redirect to CDN URL with immutable cache, base64 fallback kept
- Task 7: Projection workarounds removed — CDN URLs are tiny, queries clean again
Results: Blog SSR 2.80s→1.63s (42% faster), Image load 11.84s→0.43s (27x faster), 63MB freed from MongoDB
- Projection hotfix —
.select('-content -featuredImage.url')on all list queries to stop timeouts (Sally's Spa 33+ articles × 1MB = 33MB was crashing Vercel) - #53 Dashboard pagination — 24 articles per page, "Load more" button, server-side skip/limit
Date: March 11, 2026 Issue: EC2 server burning ~$5.76/day ($173/mo) while idle due to heartbeat misconfiguration.
- Wrong model name:
anthropic/claude-haiku-3.5doesn't exist → should beanthropic/claude-haiku-4-5 - Double-quote escaping bug:
openclaw config setwith bracket notation created key"anthropic/claude-haiku-4-5"(quotes as part of string) → haiku never matched allowlist - Silent fallback to Opus: Heartbeat model override was blocked by allowlist, fell back to primary (Opus) at ~$0.24/heartbeat
- Fixed model name to
anthropic/claude-haiku-4-5 - Set allowlist using JSON object syntax (no bracket notation) to avoid escaping bug
- Verified heartbeat cost dropped from ~$0.24 → ~$0.007 per heartbeat (34x cheaper)
- Production config: Opus primary (article generation) + Haiku heartbeat (1h interval)
- Projected idle cost: $0.17/day (down from $5.76/day)
Primary model: anthropic/claude-opus-4-6 (for scribe-worker article generation)
Heartbeat model: anthropic/claude-haiku-4-5 (1h interval, lightContext: true)
Allowlist: Both Opus + Haiku (properly configured)
- Confirm idle costs stay at ~$0.17/day — $0.05 over 4 hours = $0.30/day projected ✅
- Verify article generation quality unaffected (still using Opus) — awaiting next generation run
- Check for any new
FailoverErrorentries in logs — zero errors since fix ✅ - Token isolation test — revoked tokens, confirmed 401, deployed new token ✅
-
og-image.jpgandog-image.pngwere missing fromplatform/public/after subfolder migration - Copied from
public/→platform/public/, committed, deployed - Verified 200 OK via curl — link previews working again
- #81 — CLOSED: Idle Anthropic token consumption (root cause + fix documented)
- #80 — CLOSED: Subfolder migration complete
- #71 — Updated: OG image fix noted, tiered share cards still pending
Task 1: Stats Bar ✅ DONE
- Add stats section below site header, above search bar
- Shows: Total Articles count, Tier usage bar (e.g., "42 / 100 articles"), current month
- Warm styling — amber progress bar on cream bg, color-coded by usage (green/amber/red)
- Tier badge (Free/Pro/Business/Agency) with "Upgrade →" link when at limit
- Dashboard API now returns
tierfield - Deployed + committed:
48573f2
Task 2: Tier Badge in Sidebar ✅ DONE
- Show current plan name under user email in sidebar footer
- Color-coded badge (gray Free, amber Pro, green Business, rust Agency)
- Links to Settings page on click
- Deployed + committed:
66e021d
Task 3: Analytics & Billing sidebar items ✅ DONE
- Removed "Soon" badges — replaced with subtle amber dot indicator
- Both now link to Settings page (will point to own pages when built)
- Clickable, not dead-end — lighter text styling shows they're upcoming
- Deployed + committed:
d75c861
NOT included (P2): SEO scores (#8), publishing schedule, actual analytics data
Task 1: Navigate-away notice ✅
Task 2: Completion email ✅
Task 3: Email preferences in Settings ✅
Committed: 1c20825
- Copy link button (clipboard + checkmark feedback)
- Next/prev navigation (publishedAt order, Playfair titles)
- Committed:
e156d46
- #32 — Dashboard stats + generate more — remaining: stats already in #5
- #24 — Archive view — Month/year grouping
- #3 — Stripe billing — Critical path for monetization
- #54 — Server-side search/sort on status API — P2, when sites exceed ~100 articles
- #25 — Article limit enforcement bug
- #26 — Upgrade popup (depends on #3)
- #33 — Custom content (P2)
- #34 — Listing-driven content / Realtors (P2)
- #35 — Lead capture system (P2)
- #43 — Comments + reactions
- #46 — Lead management / CRM-lite
- #39 — Admin analytics
- #40 — Worker monitoring / auto-restart
- #11 — Multi-language / i18n
- #10 — Agency white-label
- #9 — Referral system
- #8 — SEO tracking
- #7 — Custom domains (Phase 1: Vercel API, Phase 2: AWS post-incorporation)
- #55 — MongoDB Atlas network security (tied to #7 Phase 2)
Decision: Two-phase approach
- Phase 1 (Now → Beta): Stay on Vercel. Custom domains via Vercel API. Handles 5-50 sites fine. Hobby = 50 domains, Pro ($20/mo) = 500.
- Phase 2 (Post-Incorporation): Migrate serving layer to AWS (CloudFront + S3 + ACM + Route53). Apply for AWS Activate credits ($5K-$100K) with incorporation + partner offers.
- Rationale: Don't burn cash on AWS before credits. Don't build twice. Learn from beta users first.
- Phase 2 unlocks: Unlimited custom domains, S3 image storage, VPC peering to Atlas (#55), lower marginal cost at scale.
- Platform dashboard stays on Vercel even in Phase 2 — good DX, only customer-facing blogs move to AWS.
- Dashboard sidebar navigation (#50) — 6 tasks: shared layout, Articles/Appearance/Settings pages, mobile hamburger with swipe-to-close
- Live generation experience (#47) — Showcase-style rotating messages (23 total), dot indicators, published cards slide in, celebration screen
- Website + social links (#45) — Onboarding optional fields + Settings page + worker CTA integration
- Dashboard Settings page — Brand info, online presence, plan, danger zone
- Appearance page — Layout picker + hero style picker extracted from dashboard home
- Auth page branding (#36) — Shared layout with header (logo + back link), footer
- Single article layout (#31) — Full-bleed overlay hero, Playfair headings, Inter body, share buttons (X/LinkedIn/FB), related articles sidebar, sticky header, mobile responsive
- Article hero style picker — Overlay (default) + Rounded, saved per-site
- Mobile dashboard (#37) — Responsive empty state, shorter button text
- DALL-E landscape fix (#42) — Enforced 1792x1024
- Demographic-aware images (#48) — Location-based profile for DALL-E
- Brand SEO + CTA (#44) — Brand in titles/meta, CTA block in every article
- US-only location (#49) — Google Places restricted to US
- Pagination (#18), Search (#19), Tags (#20), Sort (#21)
- Featured/pinned article (#23), Featured indicator (#28)
- Article management tools (#29), Collapsible layout selector (#30)
- Reading time on cards, Editorial read time fixes (#27)
- GitHub: https://github.com/tryscribeco/scribe (private)
- Project Board: https://github.com/orgs/tryscribeco/projects/1
- Architecture: platform/docs/ARCHITECTURE.md
- Marketing: tryscribe.co (Vercel: try-scribe)
- Platform: app.tryscribe.co (Vercel: platform-try-scribe)
- MongoDB: ScribeCluster on Atlas (Project: Scribe)
- Vercel Blob: scribe-images store (iad1), token: BLOB_READ_WRITE_TOKEN
- Latest tag: v0.9.5
- Latest commit:
fc8bb5f(operational cost breakdown in launch plan) - v0.9.2: Content Quality + Centralized Prompts (#60 closed, word count 800→1200, engagement rules, image dimension enforcement, rate limit fix)
- v0.9.1: Site Owner Article Management (#59 closed — delete, regen, upload, unpublish, manage modal, graceful 404)
- v0.9.0: Dashboard + Notifications + Article Polish
- OpenClaw agent orchestration — NOT raw API calls from Vercel
- Claude Opus 4.6 for ALL tiers — cost modeling later
- DALL-E 3 at 1792x1024 — quality non-negotiable, savings via compression not generation downgrade
- JPEG Q85 compression via sharp — same as tahaabbasi.com Scribe Walker, 78% size reduction
- Vercel Blob for image CDN — free 1GB tier, separate from Vercel bandwidth
- Linux VM for production — cheaper than Mac VM
- Per-brand subscription model — each brand = independent sub
- "Brand" not "business" in all UI copy
- Overlay+Side default blog layout — best above-the-fold
- Overlay default article hero — full-bleed with gradient
- Showcase over simulation for generation UX — educate, don't fake progress
Quick reference of what was accomplished each working session. Most recent first.
Theme: EC2 Idle Cost Audit + Heartbeat Model Fix
- Diagnosed $3.57 overnight burn on idle EC2 (Anthropic extra usage: $75.79 → $79.36)
- Found heartbeat using wrong model name
claude-haiku-3.5(doesn't exist) - Discovered
openclaw config setbracket notation double-quotes keys → allowlist bypass - Heartbeat was silently falling back to Opus ($0.24/heartbeat instead of Haiku $0.007)
- Fixed: correct model name + JSON object syntax for allowlist
- Tested at 30s, 1m, 2m intervals — confirmed Haiku costs 34x less
- Production config: Opus primary + Haiku heartbeat @ 1h = ~$0.17/day idle
- Cost savings: $5.76/day → $0.17/day ($168/month saved)
Commits since v0.9.4:
73c59cc— docs: add test accounts to testing guidea9fb359— docs: move testing guide to GitHub issue #700ca9357— docs: add AWS Startup Showcase, growth channels, Pro pricing TBD1f474d6— fix: related articles linking to /blog/ causing 404s31ad60d— feat: migrate from subdomains to subfolders for SEO authority (#80)3c13753— fix: serve marketing page at root, redirect dashboardd0bd7cb— fix: article links missing brand prefix in subfolder URLs07f2f28— docs: update ARCHITECTURE.md and README.md for subfolder model (#80)11bb6f6— Update launch plan with real cost data
Theme: True E2E Comparison + Production Hardening + Docs + 24h Monitoring
- True end-to-end Mac vs EC2 comparison via Summon button (EC2 wins: 39% more content)
- Dashboard
?worker=localrouting for testing - Vercel manual deploy workflow discovered (not auto-deploying on push)
- Accidental snapshot commit fixed (job-worker.js reverted to production)
- Word count ceiling: 1,400-1,700 target, 1,900 max
- DALL-E demographic fix: prefer no-people images
- Comprehensive README: mermaid architecture + troubleshooting flowchart + ops guide
- Sensitive infra details moved from README to DEPLOYMENT.md
- Mac Mini watchdog cron deleted
- Test accounts standardized to dev+test1-7@tryscribe.co
- 24h monitoring period started — EC2 sole production worker
- Hasnat conducting external testing
Commits: 09b4086 (latest), Release: v0.9.4
Theme: AWS Foundation + EC2 Migration + Production Pipeline
AWS Account Foundation (#63) — CLOSED
- AWS account
tryscribeco(092042969558) created, root MFA enabled - AWS Organizations + Workloads OU
- IAM Identity Center (us-east-1): AdminGroup, user
taha(taha@tryscribe.co) - Access Portal:
https://d-906605d2b0.awsapps.com/start - AWS CLI v2 + SSO profile
scribe-adminconfigured - Scribe Production account (572885593715) in Workloads OU
- CloudTrail protection SCP attached
- $150/mo budget with alerts → taha@ + dev@ + finance@tryscribe.co
- Applied for AWS Activate Founders credits ($1K)
EC2 Provisioned + Hardened (#40 Phases 1-2)
- Instance: i-025c8a724390b03d1, t3.small, Ubuntu 24.04 x86_64
- Elastic IP: 13.216.237.65, SSH config:
ssh scribe-worker - Security hardening: fail2ban, UFW, key-only SSH, auto security updates, timezone MDT
Runtime + Agent Setup (#40 Phases 3-4)
- Node.js 22.22.1 + npm installed
- Repo cloned, npm install complete (platform + worker)
- Env file:
/etc/scribe/.env(root:root, 600) - OpenClaw v2026.3.2: onboard complete, gateway running via systemd (loopback:18789)
- Agent workspace files deployed (SOUL.md, AGENTS.md, IDENTITY.md, TOOLS.md, USER.md, HEARTBEAT.md)
- Production SCRIBE-WALKER-CONTEXT.md (generic multi-tenant, no personal content)
- Scroll Worker systemd service deployed + running
Architecture & Documentation
- Full architecture doc:
platform/docs/ARCHITECTURE.md - 22-point SEO quality checklist:
platform/docs/SEO-QUALITY-CHECKLIST.md - Three-way comparison posted to GitHub issue #40
- Transcribed + analyzed Taha's 10-min voice memo on design philosophy
- Agent workspace files version-controlled:
worker/agent-workspace/ - Deployment ops guide:
worker/DEPLOYMENT.md
Worker Routing (#67) — CLOSED
WORKER_TARGETenv var:ec2default,localfor Mac Mini- Generate API:
?worker=localroutes jobs to Mac - Job model:
workerfield with compound index - Scroll Worker v0.2.0 with target display
- Git tag
mac-mini-worker-snapshotfor rollback
EC2 End-to-End Testing (#40 Phase 5) — 5 bugs found + fixed
- Agent ID: hardcoded
scribe-walker→ configurableAGENT_IDenv var - Tool profile:
messaging→full(agent needs exec/read/write) - Exec security: askFallback deny →
full+ askoff(headless server) - Session history carryover → unique
scribe-job-{jobId}-{timestamp}per job - Missing workspace files: SCRIBE-WALKER-CONTEXT.md + MongoDB creds deployed
Results: 9 articles generated on EC2 (avg 1,835 words), 6 image-regen jobs processed, DALL-E → CDN pipeline validated, completion emails working. ~4-6 min per 3-article batch.
Image Padding Detection (#69) — CLOSED
- 3-layer detection in
image-processor.ts:- Square/portrait: width ≤ height
- Solid padding: 20px scan → 100px confirmation, any color (black, cream, blue, etc.)
- Soft padding: uniform edges + edge-vs-center color distance > 40
- Tested against 5 images — all bad images caught, no false positives on valid images
- Auto-queues regeneration on rejection
OpenAI Key Standardized
- Both EC2 + Mac Mini use identical
jqextraction fromopenclaw.json - Key lives at
agents.defaults.memorySearch.remote.apiKey
Issues Filed: #67 (closed), #68 (beforeunload popup — open), #69 (closed)
Commits: 14 (46d71f0 → a6f29b9) Release: v0.9.3
Theme: Content Quality + Centralized Prompts + Rate Limiting
- Centralized prompt modules:
worker/prompts/{article-writing,quality-rules,dalle-image,tags}.js - Word count minimum: 800 → 1,200 words
- Engagement rules (no filler, no fluff, actionable content)
- Image dimension enforcement in prompts
- Rate limit separation (generation vs image-regen)
- Issue #60 closed
Theme: Dashboard Polish + Article Management + Image CDN
- Dashboard sidebar navigation (#50)
- Live generation experience (#47) — showcase messages, dot indicators, celebration
- Website + social links (#45) — onboarding + settings + worker CTA
- Site owner article management (#59) — delete, regen image, upload image, unpublish
- Image pipeline (#51) — DALL-E → sharp Q85 → Vercel Blob CDN (42% faster SSR, 27x faster images)
- Dashboard pagination (#53)
- Graceful 404 page
Theme: Blog Features + Mobile UX + Article Layout
- Blog pagination, search, tags, sort (#18-21)
- Featured/pinned articles (#23, #28)
- Single article layout (#31) — full-bleed hero, Playfair headings, share buttons
- Auth page branding (#36)
- Mobile dashboard (#37)
- DALL-E landscape fix (#42)
- Demographic-aware images (#48)
- Brand SEO + CTA (#44)
- US-only location (#49)
Theme: Platform from Zero
- Landing page + domain + GitHub (v0.1.0)
- Platform scaffold + social accounts (v0.2.0)
- Branded auth & onboarding (v0.3.0)
- Article generation — raw API (v0.4.0)
- Job queue + worker + OG images (v0.5.x)
- Blog layout system (v0.6.1)