- Batch 1 (Foundation): sites, campaign_masters, 5 independent tables - Batch 2 (Walls): 7 first-level children - Batch 3 (Roof): link_targets - Directus UI: Auto-configure dropdowns for all foreign keys - Fix template bug: campaign_name → name - Proper dependency ordering prevents constraint failures
Spark Platform
A powerful multi-tenant website platform with SEO automation, content generation, and lead capture.
🚀 Features
Multi-Tenant Website Engine
- Domain-based site routing
- Per-site content isolation
- Global admin + tenant admin access
Page Builder
- Hero Block - Full-width headers with CTAs
- Rich Text Block - SEO-optimized prose content
- Columns Block - Flexible multi-column layouts
- Media Block - Images and videos with captions
- Steps Block - Numbered process visualization
- Quote Block - Testimonials and blockquotes
- Gallery Block - Image grids with hover effects
- FAQ Block - Collapsible accordions with schema.org markup
- Posts Block - Blog listing with multiple layouts
- Form Block - Lead capture with validation
Agentic SEO Content Engine
- Campaign Management - Create SEO campaigns with spintax
- Headline Generation - Cartesian product of spintax variations
- Content Fragments - Modular 6-pillar content blocks
- Article Assembly - Automated 2000+ word article generation
- Location Targeting - Generate location-specific content
US Location Database
- All 50 states + DC
- All 3,143 counties
- Top 50 cities per county by population
Feature Image Generation
- SVG templates with variable substitution
- Server-side rendering (node-canvas)
- Queue-based batch processing
Lead Capture
- Customizable forms
- Newsletter subscriptions
- Lead management dashboard
📁 Project Structure
spark/
├── frontend/ # Astro SSR Frontend
│ ├── src/
│ │ ├── components/
│ │ │ ├── admin/ # Admin dashboard components
│ │ │ ├── blocks/ # Page builder blocks
│ │ │ └── ui/ # ShadCN-style UI components
│ │ ├── layouts/ # Page layouts
│ │ ├── lib/
│ │ │ └── directus/ # Directus SDK client
│ │ ├── pages/
│ │ │ ├── admin/ # Admin dashboard pages
│ │ │ └── api/ # API endpoints
│ │ └── types/ # TypeScript types
│ ├── Dockerfile
│ └── package.json
│
├── directus/ # Directus Backend
│ ├── scripts/ # Import/automation scripts
│ ├── template/
│ │ └── src/ # Schema definitions
│ │ ├── collections.json
│ │ ├── fields.json
│ │ └── relations.json
│ └── Dockerfile
│
├── docker-compose.yaml # Full stack orchestration
├── .env.example # Environment template
└── README.md
🛠️ Quick Start
Prerequisites
- Docker & Docker Compose
- Node.js 20+ (for local development)
1. Clone and Configure
# Copy environment file
cp .env.example .env
# Edit .env with your settings
nano .env
2. Start with Docker
# Build and start all services
docker-compose up -d
# View logs
docker-compose logs -f
3. Import Schema
# Enter Directus container
docker-compose exec directus sh
# Install dependencies and import schema
cd /directus
npm install
node scripts/import_template.js
# Load US location data
node scripts/load_locations.js
4. Access the Platform
- Frontend: http://localhost:4321
- Admin Dashboard: http://localhost:4321/admin
- Directus API: http://localhost:8055
- Directus Admin: http://localhost:8055/admin
🔧 Development
Frontend Development
cd frontend
npm install
npm run dev
Directus Schema Updates
Edit the files in directus/template/src/ and run:
node scripts/import_template.js
📊 SEO Content Engine Usage
1. Create a Campaign
In Directus Admin:
- Go to SEO Engine → Campaign Masters
- Create a new campaign with:
- Name: "Local Dental SEO"
- Headline Spintax:
{Best|Top|Leading} {Dentist|Dental Clinic} in {city}, {state} - Location Mode: "City"
2. Add Content Fragments
Create fragments for each pillar:
- intro_hook (~200 words)
- pillar_1_keyword (~300 words)
- pillar_2_uniqueness (~300 words)
- pillar_3_relevance (~300 words)
- pillar_4_quality (~300 words)
- pillar_5_authority (~300 words)
- pillar_6_backlinks (~300 words)
- faq_section (~200 words)
Use spintax and variables:
<p>Looking for the {best|top|leading} {service} in {city}?
{Our team|We} {specialize in|focus on} {providing|delivering}
{exceptional|outstanding} {results|outcomes}.</p>
3. Generate Headlines
Click "Generate Headlines" to create the headline inventory from spintax permutations.
4. Generate Articles
Select a campaign and click "Generate" to create unique SEO articles automatically.
🌐 Deployment
Coolify
- Create a new Docker Compose service
- Connect your Git repository
- Set environment variables
- Deploy
Manual Deployment
# Build images
docker-compose build
# Push to registry
docker tag spark-frontend your-registry/spark-frontend
docker push your-registry/spark-frontend
# Deploy on server
docker-compose -f docker-compose.prod.yaml up -d
📝 API Endpoints
| Endpoint | Method | Description |
|---|---|---|
/api/lead |
POST | Submit lead form |
/api/campaigns |
GET/POST | Manage SEO campaigns |
/api/seo/generate-headlines |
POST | Generate headlines from spintax |
/api/seo/generate-article |
POST | Generate articles |
/api/seo/articles |
GET | List generated articles |
/api/locations/states |
GET | List US states |
/api/locations/counties |
GET | List counties by state |
/api/locations/cities |
GET | List cities by county |
/api/media/templates |
GET/POST | Manage image templates |
🔐 Multi-Tenant Access Control
| Role | Access |
|---|---|
| Super Admin | All sites, global settings, location database |
| Site Admin | Own site only, content, SEO campaigns |
📄 License
MIT License - See LICENSE file for details.
Built with ❤️ using Astro, React, Directus, and PostgreSQL.
Description
Languages
TypeScript
56.4%
HTML
22.5%
JavaScript
9.1%
Astro
8.2%
Shell
1.8%
Other
2%