Changelog
Every fix, improvement, and new feature shipped across CopyPilot tools.
Job duplication
Copy icon on each job in the dashboard. Duplicates the job settings and rows as a new draft job and navigates directly to it. No need to reconfigure settings for repeat runs.
Re-run single row
Refresh icon on each result card in the cards view. Click to re-run just that URL through the full pipeline without rerunning the whole job. Spins while running, updates the result in place.
Results table view
Toggle between Cards and Table view on the job results page. Table shows URL, keyword, source, scrape status, AI Overview, PAA count, FAQ count, and status for all rows at a glance. Click any row to open it in card view.
Version bump to v2
Product is now public-facing with a real domain and landing page. Shifting from Streamlit parity work to genuine new features. v1.x = SaaS conversion. v2.x = product features.
Landing page
Built copypilot.app landing page. Hero with animated fade-in, tools suite showing FAQ Copy live and Meta Copy / Page Intro / Page Copy as coming soon, bottom CTA, footer. Matches dark theme of the FAQ tool.
Public changelog at copypilot.app/changelog
Created copypilot-web project for the root domain. Changelog page at copypilot.app/changelog lists all versions as a static page matching the dark theme. Changelog moved from Notion to Craft and now also lives as a public static page.
Live progress steps
Job processing now shows exactly what is happening at each step: scraping page, fetching GSC data, fetching DataForSEO keyword data, fetching AI Overview + PAA, generating FAQs. Batch mode shows Batch X/Y. Steps pulse in accent colour with percentage on the right.
Debug panel per result row
Each result row now has a collapsible debug panel matching the Streamlit app. Shows AI Overview YES/NO, attempts count, scrape status, PAA count, SERP types, and a full textarea with all data sent to AI: keyword, scraped page content, AI Overview raw, and PAA raw.
Final comprehensive audit
All 5 provider call functions verified identical to Streamlit. Integer key handling in generate_faq_batch confirmed correct. Auth key separation confirmed. 35 discrete checks all passing.
Structural audit + URL validation in batch
URL validation added to batch mode (was only in single mode). import re moved to module level. Full endpoint and Supabase field mapping verified.
Critical: runner_up key fix + rate limiting
Runner Up Keyword column was always blank due to wrong key (query vs keyword) when extracting from select_keyword result. Fixed in single and batch mode. Added rate limiting between batch AI calls. h1 "none" string now filtered. GSC debug info added to fallback keyword_source label.
46-point parity audit
URL validation for rows where URL does not start with http. faq_combined question filter added to batch mode. used_question_patterns now updated between batches so subsequent batches avoid repeating questions. _fingerprint_question moved to top-level import.
Batch keyword selection parity
Batch keyword selection brought to full parity with single mode: GSC error handling, gsc+dfs/gsc-only labels, GSC-only fallback, runner_up tracking, has_dfs_volume check. Error result dict now includes all 16 CSV fields. faq_combined newline escaping fixed.
Batch result assembly + paa_raw_text format
Batch result assembly was missing all diagnostic fields. GSC-only fallback when DFS returns zero volume. forbidden_phrases cleaned before passing to copy_gen. paa_raw_text now stores Q: .../A: ... format matching Streamlit.
CSV column order + paa_raw_text
CSV column order fixed to match Streamlit exactly (schema before FAQ content/sources). paa_raw_text now includes answer snippets in Q/A format, not just questions.
Parity: branded_terms_input + scrape_status detail
branded_terms_input was missing from JobSettings model. scrape_status now shows ok (N chars) and failed: error message matching Streamlit exactly.
CSV columns: AI Overview Content + PAA Content
Two columns were missing from CSV export: AI Overview Content (ai_overview_raw_text) and PAA Content (paa_raw_text). Added and column order corrected to match Streamlit.
JSX syntax fix
Fixed Vercel build failure caused by broken label tag structure when inserting the load_async_ai_overview toggle.
Load async AI Overview toggle + branded terms
Added load_async_ai_overview toggle (doubles DFS cost, disable on large runs). Added branded terms to exclude textarea. Both were missing from the original SaaS build.
Streamlit parity fixes
Scraper max_chars increased from 4000 to 10000. Full Brand Name field added for abbreviation expansion. Batch size default changed from 1 to 5. Keyword source labels now descriptive (gsc+dfs, gsc-only, fallback: ...). Forbidden phrases changed from comma-separated to textarea.
Custom domain: faq.copypilot.app
Purchased copypilot.app on Vercel ($9.99/yr). FAQ tool connected to faq.copypilot.app. Permanent 308 redirect from faq-saas-frontend.vercel.app. CORS locked to new domain. Supabase redirect URLs updated.
Backend crash fix
Fixed Railway crash caused by escaped quotes introduced by a bad str_replace in routers/faq.py. 54 instances of backslash-quote replaced. Python syntax was invalid, causing immediate crash on startup.
Settings page redesign
About section redesigned with version badge, live backend health indicator with animated dot, GitHub repo links, and full stack tag list. GSC upload area improved with hover animation.
TypeScript fix
Fixed Vercel build failure: Property faq_combined does not exist on type RowResult. Added all new diagnostic fields to the RowResult TypeScript type.
Favicon
Added FAQ speech bubble favicon (two-tone mint green/grey). Applied to browser tab, sidebar logo, login and signup pages. All sizes generated.
CSV output aligned to Streamlit
Previous CSV exported individual Q1/A1/Q2/A2 columns. Now exports 16 columns matching Streamlit: SEO Target Keyword, Keyword Source, Runner Up Keyword, Page Scrape Status, AI Overview Content, PAA Content, FAQ Content, FAQ Sources, FAQ Schema JSON-LD, FAQ Schema Script, FAQ Status.
Inline job rename
Hover a job name on the dashboard to reveal a pencil icon. Click to edit in place, Enter to save, Escape to cancel.
Batch size slider
Replaced batch mode on/off toggle with a slider from 1 to 15. Live explanation text updates as you drag. 1 = per-page mode (default 5). Backend groups pages into batches of batch_size per AI call.
Resizable columns
Replaced grid-based table with pixel-width layout. Drag handles on URL, Keyword, Type, H1 column headers. Minimum column width 80px. Row area scrolls horizontally.
Row management
Added multi-select checkboxes to manual row input. Select all / deselect all via header checkbox. Delete selected rows. Clear all button. Live URL count display.
Input UX improvements
Fixed page type case sensitivity. Flexible CSV column name matching (type, Type, page_type, Page Type all accepted). Smart paste parser auto-detects 2, 3, or 4 column formats.
AI model selection
Added per-provider model dropdown. Model resets to provider default when switching. Claude: Sonnet 4.6/4.5/Haiku. OpenAI: GPT-5.5/5.4. Gemini: 2.0 Flash. Mistral: Small/Large. Groq: Llama 3 70B/8B/3.3 70B.
Git author fix
Rewrote commit history on both repos to use the noreply GitHub email. Prevented Vercel deployment blocks caused by unrecognised commit author.
Auth callback + email branding
Added /auth/callback route to handle Supabase email confirmation. Set Supabase Site URL and Redirect URLs to Vercel domain. Added branded HTML email template for signup confirmation.
Supabase key fix
Fixed SupabaseException: Invalid API key. Switched from new sb_publishable_ key format to legacy JWT keys. Bumped supabase-py from 2.9.0 to 2.15.0.
Initial build
Full stack built from scratch as a standalone SaaS product, converted from the internal Streamlit app. FastAPI backend on Railway, Next.js frontend on Vercel, Supabase auth and DB. Auth flow, dashboard, new job page with manual/paste/CSV input, results page with CSV download, settings page.
CopyPilot — AI-powered SEO copy production