- Added primary_keyword, secondary_keywords, tags, and categories fields to Tasks model - Updated generate_content function to handle full JSON response with all SEO fields - Improved progress bar animation: smooth 1% increments every 300ms - Enhanced step detection for content generation vs clustering vs ideas - Fixed progress modal to show correct messages for each function type - Added comprehensive logging to Keywords and Tasks pages for AI functions - Fixed error handling to show meaningful error messages instead of generic failures
25 KiB
IGNY8 System Architecture
Version: 1.0
Last Updated: 2025-01-XX
Purpose: Complete system architecture documentation covering design patterns, principles, tech stack, and structural organization.
Table of Contents
- System Overview
- Tech Stack
- Core Architecture Principles
- Project Structure
- Key Architectural Patterns
- Multi-Tenancy Architecture
- Module Organization
- API Architecture
- Frontend Architecture
- Backend Architecture
- Database Architecture
- Security Architecture
- Deployment Architecture
System Overview
IGNY8 is a full-stack SaaS platform for SEO keyword management and AI-driven content generation. The system migrated from a WordPress plugin architecture to a modern Django + React architecture, providing a scalable, multi-account platform for content planning and generation.
Core Capabilities
- Multi-Account SaaS Platform: Complete account isolation with site/sector hierarchy
- SEO Keyword Management: Import, organize, and cluster keywords
- AI-Powered Content Planning: Automated keyword clustering and content idea generation
- AI Content Generation: Automated blog post and article generation
- Image Generation: AI-powered image generation for content
- WordPress Integration: Publish content directly to WordPress sites
- Subscription Management: Plan-based limits and billing integration
Tech Stack
Backend
- Framework: Django 5.2+ with Django REST Framework (DRF)
- Database: PostgreSQL
- Task Queue: Celery with Redis broker
- Authentication: JWT (JSON Web Tokens) + Session-based auth
- API: RESTful API with DRF ViewSets
- Caching: Redis
- File Storage: Local filesystem (configurable for S3)
Frontend
- Framework: React 19 with TypeScript
- Build Tool: Vite
- Styling: Tailwind CSS
- State Management: Zustand
- Routing: React Router v6
- HTTP Client: Fetch API with custom wrapper
- UI Components: Custom component library
Infrastructure
- Containerization: Docker & Docker Compose
- Reverse Proxy: Caddy (HTTPS on port 443)
- Process Management: Supervisor (for Celery workers)
- Monitoring: Portainer (optional)
Development Tools
- Backend: Python 3.11+, pip, virtualenv
- Frontend: Node.js 18+, npm/yarn
- Version Control: Git
- Code Quality: ESLint, Prettier (frontend), Black, Flake8 (backend)
Core Architecture Principles
1. Configuration-Driven Everything
Principle: Zero HTML/JSX duplication - All UI rendered from configuration.
- Tables, filters, forms all driven by config files
- Single source of truth - Change config, UI updates everywhere
- Page-local config for page-specific settings
- Shared snippets for reusable column/filter/action definitions
Implementation:
- Frontend: Config files in
/config/pages/and/config/snippets/ - Backend: DRF serializers and ViewSet actions
2. Multi-Tenancy Foundation
Principle: Complete account isolation with automatic filtering.
- All models inherit
AccountBaseModelwith automatic account isolation - All ViewSets inherit
AccountModelViewSetwith automatic account filtering - Middleware injects account context from JWT on every request
- Site > Sector hierarchy for content organization
Implementation:
- Base models:
AccountBaseModel,SiteSectorBaseModel - Base ViewSets:
AccountModelViewSet,SiteSectorModelViewSet - Middleware:
AccountContextMiddlewaresetsrequest.account
3. Template System (4 Universal Templates)
Principle: Reusable templates for all page types.
- DashboardTemplate: Module home pages (KPIs, workflow steps, charts)
- TablePageTemplate: CRUD table pages (Keywords, Clusters, Tasks, etc.)
- FormPageTemplate: Settings/form pages (Settings, Integration, etc.)
- SystemPageTemplate: System/admin pages (Logs, Status, Monitoring)
Implementation:
- Frontend:
/templates/directory with 4 template components - Config-driven: Templates accept config objects for customization
4. Unified AI Processor
Principle: Single interface for all AI operations.
- Single
AIProcessorclass handles all AI operations - Manual and automated workflows use same functions
- Action-based routing: 'clustering', 'ideas', 'content_generation', 'image_generation'
- Account-specific API keys and model configuration
Implementation:
- Backend:
AIProcessorclass in/utils/ai_processor.py - Integration: Loads API keys from
IntegrationSettingsmodel
5. Module-Based Organization
Principle: Clear module boundaries with shared utilities.
- Each module = Django app (
/modules/{module}/) - Clear module boundaries with shared utilities
- Module router pattern for subpage routing
- Consistent structure across modules
Implementation:
- Backend:
/modules/planner/,/modules/writer/,/modules/system/,/modules/billing/ - Frontend:
/pages/Planner/,/pages/Writer/,/pages/Settings/, etc.
Project Structure
igny8/
├── backend/ # Django backend
│ └── igny8_core/ # Django project
│ ├── auth/ # Multi-tenancy, User, Account, Plan models
│ │ ├── models.py # Account, User, Plan, Site, Sector, Industry models
│ │ ├── views.py # Account, User, Site, Sector ViewSets
│ │ ├── serializers.py # Account, User, Plan serializers
│ │ └── urls.py # Auth module URLs
│ ├── modules/ # Feature modules
│ │ ├── planner/ # Keywords, Clusters, Ideas
│ │ │ ├── models.py # Keywords, Clusters, ContentIdeas models
│ │ │ ├── views.py # KeywordViewSet, ClusterViewSet, ContentIdeasViewSet
│ │ │ ├── tasks.py # Celery tasks for AI operations
│ │ │ ├── serializers.py # Model serializers
│ │ │ └── urls.py # Planner module URLs
│ │ ├── writer/ # Tasks, Content, Images
│ │ │ ├── models.py # Tasks, Content, Images models
│ │ │ ├── views.py # TasksViewSet
│ │ │ ├── tasks.py # Celery tasks for content/image generation
│ │ │ └── urls.py # Writer module URLs
│ │ ├── system/ # Settings, Prompts, Integration
│ │ │ ├── models.py # AIPrompt, IntegrationSettings, AuthorProfile, Strategy
│ │ │ ├── views.py # AIPromptViewSet, AuthorProfileViewSet
│ │ │ ├── integration_views.py # IntegrationSettingsViewSet, task_progress
│ │ │ ├── utils.py # Default prompts, prompt loading
│ │ │ └── urls.py # System module URLs
│ │ └── billing/ # Credits, Transactions, Usage
│ │ ├── models.py # CreditTransaction, UsageLog models
│ │ ├── views.py # Billing ViewSets
│ │ └── services.py # CreditService
│ ├── api/ # API base classes
│ │ └── base.py # AccountModelViewSet, SiteSectorModelViewSet
│ ├── utils/ # Shared utilities
│ │ ├── ai_processor.py # Unified AI interface
│ │ └── content_normalizer.py # Content processing utilities
│ ├── middleware/ # Custom middleware
│ │ ├── account.py # AccountContextMiddleware (sets request.account)
│ │ └── resource_tracker.py # ResourceTrackerMiddleware (API metrics)
│ ├── settings.py # Django settings
│ ├── urls.py # Root URL configuration
│ └── celery.py # Celery configuration
│
├── frontend/ # React frontend
│ └── src/
│ ├── pages/ # Page components
│ │ ├── Planner/ # KeywordsPage, ClustersPage, IdeasPage, Dashboard
│ │ ├── Writer/ # TasksPage, DraftsPage, PublishedPage, Dashboard
│ │ ├── Settings/ # General, Integration, Status, ImportExport
│ │ ├── Billing/ # Credits, Transactions, Usage
│ │ └── AuthPages/ # SignIn, SignUp
│ ├── templates/ # 4 master templates
│ │ ├── DashboardTemplate.tsx
│ │ ├── TablePageTemplate.tsx
│ │ ├── FormPageTemplate.tsx
│ │ └── SystemPageTemplate.tsx
│ ├── components/ # UI components
│ │ ├── layout/ # AppLayout, Sidebar, Header, Breadcrumbs
│ │ ├── table/ # DataTable, Filters, Actions, Pagination
│ │ ├── ui/ # Button, Card, Modal, Toast, etc.
│ │ └── auth/ # ProtectedRoute, Auth components
│ ├── config/ # Configuration files
│ │ ├── pages/ # Page-specific configs
│ │ │ └── keywords.config.tsx
│ │ ├── snippets/ # Shared column/filter/action definitions
│ │ │ ├── columns.snippets.ts
│ │ │ ├── filters.snippets.ts
│ │ │ └── actions.snippets.ts
│ │ └── routes.config.ts # Route configuration
│ ├── store/ # Zustand stores
│ │ ├── authStore.ts # Authentication state
│ │ ├── plannerStore.ts # Planner module state
│ │ ├── siteStore.ts # Site selection state
│ │ └── aiRequestLogsStore.ts # AI request/response logs
│ ├── services/ # API clients
│ │ └── api.ts # fetchAPI, API functions
│ ├── hooks/ # Custom React hooks
│ │ ├── useProgressModal.ts # Progress modal for long-running tasks
│ │ └── useAuth.ts # Authentication hook
│ ├── layout/ # Layout components
│ │ └── AppLayout.tsx # Main app layout wrapper
│ ├── App.tsx # Root component with routing
│ └── main.tsx # Entry point
│
└── docs/ # Documentation
└── ActiveDocs/ # Active documentation
├── 01-ARCHITECTURE.md # This file
├── 02-FRONTEND.md # Frontend documentation
├── 03-BACKEND.md # Backend documentation
├── 04-AI-FUNCTIONS.md # AI functions documentation
└── 05-ACCOUNT-USER-PLAN.md # Account/User/Plan documentation
Key Architectural Patterns
Configuration System (Page-Local Config + Shared Snippets)
Rule: Config = Page-Local, Snippets = Shared
Structure:
/pages/Planner/KeywordsPage.tsx
├── Imports snippets from /config/snippets/
├── Defines page-local tableConfig, filterConfig, actionsConfig
└── Passes config to TablePageTemplate
/config/snippets/
├── columns.snippets.ts # statusColumn, titleColumn, etc.
├── filters.snippets.ts # statusFilter, dateRangeFilter, etc.
├── actions.snippets.ts # commonActions, bulkActions, etc.
Benefits:
- Reusable components across pages
- Page-specific customization
- Single source of truth for shared definitions
Base ViewSet Pattern
Backend Pattern: All ViewSets inherit from base classes for consistent behavior.
Base Classes:
AccountModelViewSet: Automatic account filteringSiteSectorModelViewSet: Account + site/sector filtering + access control
Benefits:
- Consistent access control
- Automatic account isolation
- Reduced code duplication
Celery Task Pattern
Pattern: Long-running operations use Celery tasks with progress tracking.
Structure:
- API endpoint queues Celery task
- Task updates progress via
update_state() - Frontend polls
task_progressendpoint - Progress displayed in modal
Benefits:
- Non-blocking API responses
- Real-time progress updates
- Scalable background processing
AI Function Pattern
Pattern: All AI functions follow consistent structure.
Structure:
- API Endpoint: Validates input, queues Celery task
- Celery Task: Wraps core function with progress tracking
- Core Function: Business logic, calls AIProcessor
- AIProcessor: Makes API calls, returns structured data
- Core Function: Saves results to database
Benefits:
- Consistent error handling
- Progress tracking
- Reusable AI interface
Multi-Tenancy Architecture
Account Isolation
Principle: All data is isolated by account.
Implementation:
- All models inherit
AccountBaseModel(hasaccountForeignKey) - All ViewSets inherit
AccountModelViewSet(filters byrequest.account) - Middleware sets
request.accountfrom JWT token
Access Control:
- Admin/Developer users: Bypass account filtering (see all accounts)
- System account users: Bypass account filtering (see all accounts)
- Regular users: Only see data from their account
Site/Sector Hierarchy
Structure:
Account (1) ──< (N) Site
Site (1) ──< (1-5) Sector
Sector (1) ──< (N) Keywords, Clusters, ContentIdeas, Tasks
Implementation:
- Models inherit
SiteSectorBaseModel(hassiteandsectorForeignKeys) - ViewSets inherit
SiteSectorModelViewSet(filters by accessible sites) - User access control via
User.get_accessible_sites()
Site Access Control:
- System account users: All active sites
- Developers: All active sites
- Owners/Admins: All sites in their account
- Editors/Viewers: Only sites granted via
SiteUserAccess
Module Organization
Planner Module
Purpose: Keyword management and content planning.
Models:
Keywords: Individual keywords with volume, difficulty, intentClusters: Keyword clusters (groups of related keywords)ContentIdeas: Content ideas generated from clusters
ViewSets:
KeywordViewSet: CRUD +auto_clusteractionClusterViewSet: CRUD +auto_generate_ideasactionContentIdeasViewSet: CRUD operations
Tasks:
auto_cluster_keywords_task: AI-powered keyword clusteringauto_generate_ideas_task: AI-powered content idea generation
Writer Module
Purpose: Content generation and management.
Models:
Tasks: Content generation tasksContent: Generated content (HTML)Images: Generated images for tasks
ViewSets:
TasksViewSet: CRUD +auto_generate_content,auto_generate_imagesactions
Tasks:
auto_generate_content_task: AI-powered content generationauto_generate_images_task: AI-powered image generation
System Module
Purpose: System settings, prompts, and integrations.
Models:
AIPrompt: AI prompt templates (clustering, ideas, content, images)IntegrationSettings: API keys and configuration (OpenAI, Runware, etc.)AuthorProfile: Writing style profilesStrategy: Content strategies per sector
ViewSets:
AIPromptViewSet: CRUD for promptsIntegrationSettingsViewSet: CRUD +test_openai,test_runware,generate_image,task_progressactionsAuthorProfileViewSet: CRUD for author profilesStrategyViewSet: CRUD for strategies
Billing Module
Purpose: Credits, transactions, and usage tracking.
Models:
CreditTransaction: Credit purchase/usage transactionsUsageLog: Daily/monthly usage tracking
ViewSets:
CreditTransactionViewSet: CRUD for transactionsUsageLogViewSet: Read-only usage logs
Services:
CreditService: Credit calculation and deduction logic
API Architecture
RESTful API Design
Base URL: /api/v1/
Endpoint Structure:
/api/v1/planner/keywords/- Keywords CRUD/api/v1/planner/keywords/auto_cluster/- Auto-cluster action/api/v1/planner/clusters/- Clusters CRUD/api/v1/planner/clusters/auto_generate_ideas/- Auto-generate ideas action/api/v1/writer/tasks/- Tasks CRUD/api/v1/writer/tasks/auto_generate_content/- Auto-generate content action/api/v1/system/settings/task_progress/{task_id}/- Task progress polling
Authentication
Methods:
- JWT (JSON Web Tokens) - Primary method
- Session-based auth - Fallback for admin
Flow:
- User signs in → Backend returns JWT token
- Frontend stores token in localStorage
- Frontend includes token in
Authorization: Bearer {token}header - Backend middleware validates token and sets
request.userandrequest.account
Response Format
Success Response:
{
"success": true,
"data": { ... },
"message": "Optional message"
}
Error Response:
{
"success": false,
"message": "Error message",
"errors": { ... }
}
Pagination
Format: Page-based pagination
Response:
{
"count": 100,
"next": "http://api.example.com/api/v1/resource/?page=2",
"previous": null,
"results": [ ... ]
}
Frontend Architecture
Component Hierarchy
App
└── AppLayout
├── Sidebar (navigation)
├── Header (user menu, notifications)
└── Main Content
└── Page Component
└── Template (DashboardTemplate, TablePageTemplate, etc.)
└── Components (DataTable, Filters, etc.)
State Management
Zustand Stores:
authStore: Authentication state (user, token, account)plannerStore: Planner module statesiteStore: Selected site/sectoraiRequestLogsStore: AI request/response logspageSizeStore: Table page size preference
Local State: React useState for component-specific state
Routing
Structure: React Router v6 with nested routes
Routes:
/- Home/Dashboard/planner- Planner Dashboard/planner/keywords- Keywords page/planner/clusters- Clusters page/planner/ideas- Ideas page/writer- Writer Dashboard/writer/tasks- Tasks page/settings- Settings pages
Protected Routes: All routes except /signin and /signup require authentication
Backend Architecture
Model Inheritance Hierarchy
models.Model
└── AccountBaseModel (adds account ForeignKey)
└── SiteSectorBaseModel (adds site, sector ForeignKeys)
└── Keywords, Clusters, ContentIdeas, Tasks, etc.
ViewSet Inheritance Hierarchy
viewsets.ModelViewSet
└── AccountModelViewSet (adds account filtering)
└── SiteSectorModelViewSet (adds site/sector filtering)
└── KeywordViewSet, ClusterViewSet, TasksViewSet, etc.
Middleware Stack
- SecurityMiddleware: Django security middleware
- SessionMiddleware: Session management
- AuthenticationMiddleware: User authentication
- AccountContextMiddleware: Sets
request.accountfrom JWT - ResourceTrackerMiddleware: Tracks API request metrics
Celery Task Architecture
Broker: Redis
Workers: Separate Celery worker processes
Task Structure:
@shared_task(bind=True)
def my_task(self, ...):
# Update progress
self.update_state(state='PROGRESS', meta={...})
# Do work
result = do_work()
# Return result
return result
Progress Tracking:
- Frontend polls
/api/v1/system/settings/task_progress/{task_id}/ - Backend returns task state and meta information
- Progress displayed in modal
Database Architecture
Core Tables
igny8_accounts: Account informationigny8_users: User accountsigny8_plans: Subscription plansigny8_subscriptions: Active subscriptionsigny8_sites: Sites within accountsigny8_sectors: Sectors within sitesigny8_industries: Global industry templatesigny8_industry_sectors: Industry sector templates
Planner Tables
igny8_keywords: Keywordsigny8_clusters: Keyword clustersigny8_content_ideas: Content ideas
Writer Tables
igny8_tasks: Content generation tasksigny8_content: Generated contentigny8_images: Generated images
System Tables
igny8_ai_prompts: AI prompt templatesigny8_integration_settings: API keys and configurationigny8_author_profiles: Writing style profilesigny8_strategies: Content strategies
Billing Tables
igny8_credit_transactions: Credit transactionsigny8_usage_logs: Usage tracking
Indexes
Account Isolation: All tables have indexes on account
Site/Sector Filtering: Tables with site/sector have composite indexes on (account, site, sector)
Performance: Indexes on frequently queried fields (status, created_at, etc.)
Security Architecture
Authentication
JWT Tokens:
- Signed with secret key
- Contains user ID and account ID
- Expires after configured time
- Stored in localStorage (frontend)
Session Auth:
- Fallback for admin interface
- Django session framework
Authorization
Role-Based Access Control (RBAC):
developer: Full system accessowner: Full account accessadmin: Account admin accesseditor: Content editing accessviewer: Read-only access
Access Control:
- Account-level: Automatic filtering by
request.account - Site-level: Filtering by
user.get_accessible_sites() - Action-level: Permission checks in ViewSet actions
Data Isolation
Account Isolation:
- All queries filtered by account
- Admin/Developer override for system accounts
Site Access Control:
- Users can only access granted sites
- Admin/Developer override for all sites
API Security
CORS: Configured for frontend domain
CSRF: Enabled for session-based auth
Rate Limiting: (Future implementation)
Input Validation: DRF serializers validate all input
Deployment Architecture
Docker Compose Setup
Services:
backend: Django application (port 8010/8011)frontend: React application (port 5173/8021)db: PostgreSQL databaseredis: Redis for Celery broker and cachingcaddy: Reverse proxy (HTTPS on port 443)celery-worker: Celery worker processcelery-beat: Celery beat scheduler (optional)
Environment Configuration
Backend:
DJANGO_SETTINGS_MODULE: Django settings moduleDATABASE_URL: PostgreSQL connection stringREDIS_URL: Redis connection stringSECRET_KEY: Django secret keyOPENAI_API_KEY: OpenAI API key (fallback)
Frontend:
VITE_API_URL: Backend API URLVITE_APP_NAME: Application name
Scaling Considerations
Horizontal Scaling:
- Multiple Celery workers
- Multiple backend instances (load balanced)
- Multiple frontend instances (static files)
Vertical Scaling:
- Database connection pooling
- Redis connection pooling
- Celery worker concurrency
Monitoring
Application Monitoring:
- ResourceTrackerMiddleware tracks API request metrics
- Celery task monitoring via Flower (optional)
Infrastructure Monitoring:
- Portainer for container monitoring
- Database monitoring via PostgreSQL logs
- Redis monitoring via Redis CLI
Summary
The IGNY8 architecture is built on:
- Configuration-Driven Design: Zero duplication, single source of truth
- Multi-Tenancy Foundation: Complete account isolation with site/sector hierarchy
- Template System: 4 universal templates for all page types
- Unified AI Interface: Single AIProcessor for all AI operations
- Module-Based Organization: Clear boundaries with shared utilities
- RESTful API: Consistent API design with DRF
- Modern Frontend: React + TypeScript with Zustand state management
- Scalable Backend: Django + Celery for async processing
- Security First: JWT auth, RBAC, data isolation
- Docker Deployment: Containerized for easy deployment and scaling
This architecture ensures scalability, maintainability, and extensibility while maintaining a clean separation of concerns across modules.