Changelog
All notable changes for TuxSEO.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Added
- Analytics
- implementation-ready integration analytics architecture spec covering GA4, GSC, and Plausible (
docs/integration-analytics-architecture-v1.md) - analytics ingestion models:
AnalyticsSourceSnapshot,AnalyticsFactDaily, andAnalyticsSyncCursor - provider ingestion service + connectors for GA4, GSC, and Plausible with cursor-based incremental sync
- scheduled analytics sync dispatcher (
schedule_project_analytics_syncs) and worker task (sync_project_integration_analytics) - retry/backoff handling for transient provider failures and rate limits with cursor/snapshot observability
- tests for incremental cursor behavior, idempotent upserts, and failure recording
- Project Home "Analytics (GA4/GSC/Plausible)" UI section with provider connection badges, 30-day rollups, derived rates, 7-day trend deltas, and top low-CTR/high-impression SEO opportunities
- new per-project Analytics page foundation (
/project/<pk>/analytics/) with project-scoped access control, navigation wiring, integration-aware empty states/CTA, and section shells for Overview KPIs, Traffic/Engagement, Conversions/Revenue, and Data source health/status - project analytics aggregation API contract (
GET /api/projects/{project_id}/analytics/aggregation) with validated date-range controls, normalized overview/source/source-health response blocks, cursor-aware partial-source health metadata, and short-lived cache hydration - v1 detailed analytics experience on the dedicated Analytics page: date-range presets/custom picker with refresh, API-driven KPI cards, source health badges (connected/stale/missing), sessions trend bars, provider breakdown table, and top-page breakdown table
- project analytics aggregation API now includes
daily_trendandpage_breakdownblocks for UI chart/table rendering on date-range changes - analytics page v1 interaction/error telemetry via PostHog:
analytics_page_viewed,analytics_date_range_changed,analytics_refresh_clicked,analytics_source_error_shown - Analytics page QA data-correctness checklist + production troubleshooting runbook (
docs/analytics-page-data-correctness-checklist.md) - Project Home analytics simplified to summary-only snippets + clear "View detailed analytics" CTA to avoid duplicate dense analytics blocks
- Pages
- added changelog page
- features to the pro plan on pricing page
- paid-only per-page "Your Pages" DetailView route (
project/<project_pk>/pages/<page_pk>/) with server-enforced Pro gating, explicit free-plan upgrade CTA, and shell sections for Overview, SEO Analysis, and Backlink Opportunities - loading/empty/error UX states for the new page DetailView shell to support safe progressive rollout before analysis/recommendation internals are wired
- SEO Analysis Engine v1 for single-page command centers with deterministic checks (title length, meta description length, H1 presence, body depth, internal links, summary coverage), score breakdown UI, and regression tests
- JSON-LD schema analysis v1 in page SEO analysis (script detection, baseline validation, parse-error-safe reporting, and starter recommendations for WebPage/Article) with UI-visible state labels and template guidance
- page DetailView SEO Analysis UX upgrade: overall v1 scorecard, pass/warn/fail prioritization, beginner-friendly "why it matters" + "how to fix" guidance, JSON-LD detected-schema + issue-list subsection, copy-friendly starter block, and explicit freshness/source metadata with run/refresh CTA states (idle/analyzing/success/failed)
- Backlink prospect discovery engine v1 for page DetailView: topic extraction from project/page metadata, Exa-backed web search with relevance/domain filters and dedupe, and rendered candidate list (title/domain/snippet/topic/source) in Backlink Opportunities
- backlink quality guardrails for opportunities: weighted relevance scoring (topic match, content type fit, domain credibility proxy, freshness), canonical-domain + normalized-URL dedupe, low-signal junk page filtering, rank-ordered results, and explanation fields surfaced in the page DetailView
- backlink prospect contact/social enrichment v1: best-effort public HTML signal extraction for contact page URL, public email, X/Twitter, LinkedIn, and author profile with explicit
found/low_confidence/not_foundstatuses, confidence labels, source traces, and outreach rendering in page DetailView - Backlink Opportunities DetailView UX v1: ranked scannable table, relevance/type reasoning, quick actions (open source + copy contact data), filters/sorts (highest relevance, has contact, newest discovered), and safe refresh-state handling while discovery jobs run
- JSON-LD example payloads for UI consumers (
docs/json-ld-analysis-examples-v1.md) - persisted per-page SEO analysis run history (
ProjectPageAnalysisRun) with queued/running/succeeded/failed lifecycle states, active-run dedupe lock, rerun cooldown guardrails, failure diagnostics, compact payload snapshots, and DetailView history/status UI (docs/seo-analysis-run-retention.md) - paid DetailView guardrails for page command center modules: feature flags (
seo_analysis,backlink_discovery,contact_enrichment), per-profile daily quotas, backlink cooldowns, and API-layer action rate limiting with user-safe messaging - page DetailView staff-only debug panel for failed SEO runs + backlink discovery failure context
- periodic sitemap sync for "Your Pages" across sitemap-enabled projects with per-project locking, sitemap index traversal, stale URL marking, and configurable scheduler interval
- manual per-project sitemap "Sync now" API trigger for support/debugging
- Monitoring
- Sentry Agent Monitoring
- structured PostHog Logs pipeline for backend logs (web requests, background jobs, AI generation flows) with correlation IDs, async OTLP batching, and redaction safeguards
- PostHog LLM analytics instrumentation for PydanticAI generation flows via
$ai_generationevents, including latency/token metrics, feature-path context, and failure diagnostics - PostHog product analytics taxonomy v2 with required-property validation, P1 funnel coverage matrix, and server-side event instrumentation for login, integrations, keywords, page analysis, title/content generation, publish outcomes, link-exchange toggles, and plan lifecycle events
- idempotent PostHog dashboard bootstrap script + published first-pass dashboard pack for operational health, product funnel health, and LLM reliability/cost health (
scripts/posthog_dashboard_bootstrap.py,docs/posthog-dashboards.md) - paid-acquisition attribution foundation (Meta/Google/Reddit/X): first-touch/latest-touch persistence on Profile+Project, UTM/click-id ingestion, canonical campaign/ad/creative/copy schema, and server-side attribution enrichment for funnel/revenue events
- new PostHog canonical events for activation/revenue attribution coverage:
onboarding_completed,first_content_generated,subscription_started,paid_conversion - paid acquisition dashboard pack extension with channel, campaign/adset/ad, copy/creative, and signup→paid conversion timing tiles
- DetailView paid-module telemetry expansion:
detail_view_opened,seo_analysis_run_started/completed/failed,backlink_discovery_started/completed/failed,opportunities_viewed, andcontact_method_copiedwith schema docs + ops runbook (docs/detail-view-analytics-events.md,docs/detail-view-ops-notes.md) - Posts
- custom post types per project with validated name + prompt guidance, CRUD management UI, and Posts navigation integration
- custom post types can be selected in navigation and applied as generation guidance for title suggestions
- custom post-type guidance now also propagates into full article generation, with regression coverage for both title and content generation paths
- custom post type create/edit flow now supports optional logo uploads (PNG/JPG/WEBP/GIF up to 2MB), persists logos on the type record, renders logos across post-type UI surfaces, and falls back to default icons when no logo is set
- dedicated custom post type edit page with validated updates for name/prompt/logo, explicit logo removal, and regression coverage for edit persistence + validation failures
- safe custom post type deletion flow with explicit confirmation modal, backend dependency guardrails that block deletion while active ideas still reference the type, and regression tests for confirmed-delete + blocked-delete paths
- Emails
- Feedback email (for profiles with one product)
- create project reminder for signed up users without project
- project successfully created email
- CRM
- Added dedicated Twenty signup sync on project creation to upsert warm leads (
core.twenty_signup_sync.sync_signup_project_to_twenty) with idempotent person/company matching and feature-flagged execution (TWENTY_SIGNUP_SYNC_ENABLED). - Added async task wiring for project-created trigger (
core.tasks.sync_signup_project_to_twenty) and CRM config settings (TWENTY_CRM_BASE_URL,TWENTY_CRM_API_KEY,TWENTY_SIGNUP_SYNC_TIMEOUT_SECONDS,TWENTY_SIGNUP_SYNC_MAX_RETRIES).
Fixed
- Analytics
- added backward-compatible scheduled task alias
core.scheduled_tasks.sync_connected_project_analyticsso older Django Q scheduler entries continue dispatching analytics sync jobs - fixed
FieldErroron publish history page - Posted posts should not appear on SEO Optimized and Eye Catching post pages.
- emails
- nudge to add sitemap in the first blog post generated email
- GeneratedBlogPost description should suggested_meta_description not description
[0.0.8] - 2025-11-23
Added
- Added link exchange program for paid users
deleted_atfield for the BaseModel to support soft_deletion where necessary.- Add soft_delete method on BaseModel
- Table of contents to Project Settings Page (only shows h2 headings)
- OG Image generation for generated posts
- Handle link of an image in submit blog post endpoint
- Vectors to ProjecPages and Competitors
- Docs section
- Automatically create a keyword from project name and mark it as used when processing project keywords
Changed
- using gtpr for writing posts
- og image and automatic generation are off by default
- Navbar spacing rules
- Rafctor of agents and utils.
- Post cateogries now have separate pages.
Fixed
- correct link on project scan
- Cloudlfare Turnstyle now actaully does stuff
- Competitor table scrolling on mobile
- Toggle switches on settings page now use consistent dark gray color
- competitor links
Removed
- banner from app pages
[0.0.7] - 2025-11-02
Added
- Copy as HTML on Generated Blog Posts.
- PDF Generation for blog posts.
- Centralized location of all AI models used in the app.
- Referrer model to display banners for expected referrer like producthunt
- Competitors page to view all competitors for any given project
- sitemaps support
- project pages in the ui for projects
- add the ability to select which project pages will always be used in project generations.
- blog posts use project pages more intelligently with two-tier system:
- Required pages (always_use=True) must be linked in generated content
- Optional pages are suggested for AI to use intelligently based on relevance
- Cloudflare turnstile and remove blocking project creation for uncofirmed emails.
- Onboarding Flow
- Add MJML for custom emails.
- admin panel page
- new validation to see if content start with a header
- a few keywords for placeholder image/link detection
- page to show publish history
- Check that will make sure blog post is valid before submitting to endpoint.
- Endpoint to Fix the validation errors.
- Self fixing for Content generated in an automated task.
- Target Keywords that are generated in a Title Suggestion, now get saved to project keywords.
- You can hover over a Target keyword to get summary stats.
- You will now see which keywords are being use
- You can now set keywords to use from the Title Suggestions view
- Google Auth
- Added a way to delete projects (irreversably)
Changed
- Project UI updated to be more intuitive.
- PydanticAI library upgrade.
- update to user-settings page
- Enhanced blog post generation to intelligently use project pages based on
always_useflag - Fixed and improved all limitations based on plans.
- styling and info about pricing on the user-settings page
- more accurate logic for how many ideas are generated when clicked "Generate more"
- Don't let people create project from url that has been added previously
- superusers are considered to have a subscription
- landing page and home page are different.
- Landing page design + content
- how logs are sent to sentry
- Generate More Ideas now shows up all the time
Fixed
- actually run validations now
- link to the generated blog post upon creation
- if we failed to get project content and analyze it, delete the project
[0.0.6] - 2025-09-15
Added
- Instruction on how to deploy via docker compose and pure python/django.
Changed
- The name of the app to 'TuxSSEO'.
Fixed
- Github login not showing up.
[0.0.5] - 2025-09-08
Added
- Automatic super-simple deployment via Render
[0.0.4] - 2025-08-19
Added
- More info on the Generated Blog Post page, as well as the post button.
- Keywords:
- Separate page with keywords for each project
- Ability to select which keywords will be used in post generation
- Ablity to sort the table
- Converted keyword addition form to modal interface for cleaner UI
- Get more "People also search for" and "Related" keywords
- allow users to delete keywords
- My name to generated blog posts
- Disbale project creation for unverified users
- More logs for content generation to better track progress
- Added a couple of logs to Django Ninja Auth module and Submit Post endpoint
- Group name to submit blog post task
Removed
- Logging config for django-q module as I suspect it was messing with the Sentry Error logging
- Excessive details in the logs
Changed
- Authneticate classes in auth.py to follow proper way from django-ninja docs
- Genereate Content prompts
- Design of the Title Suggestion card to be a little more visually appealing, plus added date
Fixed
- Error Reporting for Django-Q2
generate_and_post_blog_postUnboundLocalError- UI on the user-settings page, plus issue with Update Subscription links
- UI on the login and signup pages
- Saving the Auto Posting setting
[0.0.3] - 2025-08-10
Added
- A page for generated content
Removed
- Various agents, focus on generating blog post content
- PricingPageAnalysis and CompetitorBlog post models
- Views for now unsporrted models
- Posthog Alias Creation in HomePageView
Changed
- Simplification of the design and the UI
[0.0.1] - 2025-08-09
Added
- Adding automated posting feature
Fixed
last_posted_blog_postfixed when don't exist- Schedule post if there are no posts from the past