Changelog
What we shipped
Build status in plain English. New features, fixes, and infrastructure shipped to production.
Build hardening: zero warnings, lazy credential init, proxy migration
2026-05-08
- ›Fixed production build failure: Stripe SDK no longer throws at module-evaluation time when STRIPE_SECRET_KEY is absent — check moved to runtime
- ›Fixed /api/niche/run build failure: Upstash Redis.fromEnv() moved inside handler function so it does not execute during static page collection
- ›Migrated middleware.ts → proxy.ts with exported proxy() function per Next.js 16 spec — eliminates deprecation warning from every build
- ›Fixed Turbopack workspace-root warning: turbopack.root set to project directory in next.config.mjs
- ›pnpm build now compiles clean with zero errors and zero warnings across all 47 pages
Waitlist admin, invite email flow, waitlist confirmation
2026-05-08
- ›Waitlist admin page at Settings > Invite codes > Waitlist — see all signups, breakdown by source, one-click send invite from unused codes
- ›Waitlist signup now sends a confirmation email via Resend — links to /demo and /changelog
- ›Beta invite code persists through magic link round-trip via httpOnly cookie — auto-redeems on onboarding completion
- ›/beta page now shows invite code banner on the login page so users know their code was received
- ›Invite admin page links to Waitlist view
Beta launch: invite codes, /beta page, smoke tests, API health
2026-05-08
- ›New /beta page — invite-code-gated entry point for soft launch, shows feature list and routes to sign up
- ›Invite code system — generate batches from Settings > Invite codes (Scale plan), redeem from Settings > Account
- ›Send invite codes by email directly from the admin page — one field per code, powered by Resend
- ›Codes are single-use, expiry-aware, and tracked per user in the DB
- ›GitHub Actions weekly smoke test checks all 14 public routes + /api/status every Monday at 09:00 UTC
- ›New /api/status JSON endpoint — returns ok + per-service health, used by smoke tests and external monitors
- ›Settings nav shows Invite codes tab for Scale (admin) users only
Performance + accessibility hardening
2026-05-08
- ›Fonts now self-hosted via next/font/google — eliminates render-blocking request to Google Fonts, improves Lighthouse Performance score
- ›Skip-to-content link added for keyboard navigation (WCAG 2.4.1)
- ›Dashboard nav now marks the active page with aria-current='page' for screen readers
- ›Viewport metadata exported separately per Next.js 14 spec — fixes Lighthouse 'viewport not set' warning
- ›All public + dashboard pages now have id='main-content' as skip link target
- ›Sound player buttons now have descriptive aria-label (Play/Pause + track name)
- ›Search input and sound label input now have explicit aria-label attributes
Recording cockpit, Sounds library, YouTube connect
2026-05-08
- ›New /dashboard/record/[id] — record directly in the browser with MediaRecorder. Camera + mic or audio-only. 3-second countdown, full/hook/beat teleprompter modes, speed control, review before saving
- ›Recording is saved to Supabase Storage and the item transitions to 'recorded' automatically
- ›Brain → Sounds tab is now a real audio library — drag-drop or click to upload voice memos, music, SFX, and reference audio (MP3/WAV/OGG/M4A up to 50 MB), play back in browser
- ›Analytics page → YouTube connect banner — one click to authorize your channel via Google OAuth. Channel name + last sync date show once connected
- ›Queue item detail page now shows both Teleprompter and Record buttons side by side
Stripe Checkout wired
2026-05-08
- ›Paid plans (Starter, Pro, Scale) now route through Stripe Checkout — no more stub plan switch for live payments
- ›Webhook handler processes subscription updates, payment failures, and cancellations in real time
- ›Trial plan stays free (no Stripe session created)
- ›Graceful fallback: if Stripe key not set, stub mode works as before for local dev
- ›Stripe customer ID stored per user — returning subscribers skip re-entry of card details
Calendar: drag-drop scheduling with platform swimlanes
2026-05-08
- ›Drag any queue item onto the week grid to schedule it — drops write directly to your calendar
- ›Three platform swimlanes: YouTube, LinkedIn, Shorts — one item per platform per day
- ›Conflict detection blocks drops when a slot is already taken, with a clear error message
- ›Smart suggestion banner surfaces how many ready-to-record items still have no publish date
- ›Unschedule items by dragging back to the tray or clicking the × on a scheduled chip
- ›Week navigation (prev/next) with today highlighted in brass
- ›Refresh button on Topics page now shows live feedback: items added, rate limit hit, or Apify not connected
- ›Topics empty state now shows Apify setup guide (4 steps) when API key is missing instead of a useless refresh prompt
Demo mode, bug fixes, and OG images
2026-05-08
- ›New /demo page — see the full Topics + Queue + Script experience before signing up, no account needed
- ›Fixed: new users who clicked Skip on onboarding hit an error boundary — now resolves reliably for all new signups
- ›Fixed: OG image (for LinkedIn/Twitter share previews) now renders correctly at /opengraph-image
- ›Removed dev copy from /pricing page that was visible to all visitors
- ›Added /demo to sitemap and robots.txt so search engines can index it
NicheMonitor: daily topic candidates from YouTube outliers
2026-05-07
- ›Topics page now shows AI-generated content angles based on outlier YouTube videos in your niche
- ›Each candidate shows: source video, views, outlier multiplier, your proposed angle, the content gap, ICP fit score, and format pattern
- ›One-click Write this flow: pick a topic, it lands in your queue as a ready-to-script idea
- ›Refresh button triggers a manual niche scan — automatic daily run at 6am once Apify is connected
- ›Rate limiting: 1 run per hour per user to prevent API cost spikes
SOLID refactor + OWASP security hardening
2026-05-06
- ›NicheMonitor codebase split into 4 single-responsibility modules — faster to ship features going forward
- ›Rate limiting added to the niche run API (Upstash Redis sliding window)
- ›UUID validation added at all server action boundaries — prevents injection via form parameters
- ›Error messages sanitized: raw error strings no longer leak to the browser
- ›Cron job wired in vercel.json — daily niche run at 6am UTC
- ›24 unit tests written for all pure utility functions
Content queue v2: SmartBoard, templates, and key navigation
2026-05-05
- ›SmartBoard surfaces the one thing to do next based on your pipeline state — no more staring at 20 items
- ›Queue items can now be saved as templates and reused across projects
- ›Keyboard navigation between queue items ([ and ] keys, or n/p)
- ›Overdue and stale item detection with visual urgency signals
- ›Queue stats panel: scripted count, scheduled count, published this month, streak
LinkedIn engine: 7 formats from any source
2026-05-04
- ›Paste any source — YouTube URL, blog link, video transcript, or a one-line topic
- ›Get 6-7 LinkedIn posts in your voice: story, listicle, framework, contrarian, data insight, quick win, founder receipt
- ›Idempotency cache: same source + same formats = no redundant AI spend
- ›Cap check before generation — clear upgrade path when monthly budget is reached
- ›Send to LinkedIn button pushes any script section directly to the LinkedIn engine pre-filled
Script generator: Hook + CRAFT in your voice
2026-05-03
- ›Generate a full 7-step script (Hook → Core insight → Receipt → Action → Failure mode → Takeaway) from any queue item
- ›Scripts are fingerprinted to your voice card — tone, stance, and reference creators inform every section
- ›Section-level regeneration: hate one part, regenerate just that section
- ›Teleprompter mode for recording — full-screen, scrolling, adjustable speed
- ›Word count and read time shown per section and for the full script
Voice card onboarding (12 questions + 90-second monologue)
2026-05-02
- ›6-step wizard captures positioning, unfair advantage, proof points, audience, ICP, compound topic, and voice baseline
- ›Voice Capture component: speak for 90 seconds, live transcription fills the box
- ›Brand Blueprint auto-generated from answers: 5-axis authority radar, content pillars (60/30/10), LinkedIn angles
- ›Placeholder mode: skip the wizard, complete it later — AI gens still work with reduced personalization
- ›All answers editable any time from Settings > Identity
Brain: your knowledge base that powers every generation
2026-05-01
- ›Add rules (writing guidelines, tone notes, things to avoid) that inject into every AI generation
- ›Add reference sources (book titles, URLs, frameworks) that AI cites and models from
- ›Knowledge entries are vector-embedded and semantically matched to each generation prompt
- ›Search across all entries. Tag by kind: rule, source, insight, example, constraint
Analytics dashboard + brand health tracking
2026-04-30
- ›Brand health score across 5 axes: cadence, consistency, engagement, authority signals, pipeline health
- ›Publishing streak counter — consecutive days with at least one published piece
- ›AI spend tracker: daily and monthly cost per generation, broken down by feature
- ›Content timeline chart: published items over rolling 30 days
- ›Today panel on the main dashboard: what's scheduled, what's overdue, what needs action
Outliers library: paste what worked, model from it
2026-04-28
- ›Manual outlier intake: paste a YouTube URL or title, add view counts, and we calculate the outlier multiplier
- ›Outlier multiplier = your video's views ÷ channel average — shows how much it overperformed
- ›Inspired by link in queue items traces every script back to its source outlier
- ›Search and filter by channel, hook type, and performance