A website SEO analysis tool demonstrating Render Workflows for distributed task execution.
Enter a URL and the app crawls your site, spawning parallel analysis tasks across multiple instances to check:
- Meta tags: Title, description, Open Graph tags
- Broken links: HTTP status validation
- Heading structure: H1-H6 hierarchy
- Image accessibility: Alt text presence
- Performance: Page size, load time, resource count
┌─────────────────┐ ┌──────────────────────────────────────┐
│ API Service │ │ Workflow Service │
│ │ │ │
│ HTML Form ───────────────▶ audit_site task │
│ │ SDK │ │ │
│ Results UI ◀─────────────│ ▼ │
│ │ │ crawl_pages task │
└─────────────────┘ │ │ │
│ ▼ │
│ ┌───────────────────────────────┐ │
│ │ analyze_page analyze_page │ │
│ │ analyze_page analyze_page │ │
│ │ ... (parallel tasks) │ │
│ └───────────────────────────────┘ │
└──────────────────────────────────────┘
- A Render account with Workflows access (request at render.com/workflows)
- A Render API key
- Python 3.10+
Workflows are created via the Render Dashboard (not render.yaml during early access):
- Go to the Render Dashboard
- Select New > Workflow
- Connect your repository containing this code
- Configure:
- Name:
seo-audit-workflow - Root Directory:
python - Build Command:
pip install -r requirements.txt - Start Command:
render-workflows workflows.main:app
- Name:
- Deploy the workflow
Use the included render.yaml blueprint:
- Go to the Render Dashboard
- Select New > Blueprint
- Connect this repository
- Configure environment variables:
RENDER_API_KEY: Your Render API keyWORKFLOW_SLUG: The slug of your workflow (e.g.,seo-audit-workflow)WORKFLOW_ID: The workflow ID (e.g.,wfl-xxxxx) for task discovery in the UI
Or deploy manually:
- Select New > Web Service
- Connect your repository
- Configure:
- Name:
seo-audit-api - Root Directory:
python - Build Command:
pip install -r requirements.txt - Start Command:
gunicorn --chdir api app:app
- Name:
- Add the environment variables listed above
See the main README for frontend deployment instructions. The frontend is shared between Python and TypeScript backends.
-
Create and activate a virtual environment:
python3 -m venv .venv source .venv/bin/activate -
Upgrade pip:
pip install --upgrade pip
-
Install dependencies:
pip install -r requirements.txt
-
Create a
.envfile:cat > .env << 'EOF' RENDER_USE_LOCAL_DEV=true WORKFLOW_SLUG=seo-audit-workflow WORKFLOW_ID=wfl-xxxxx EOF
-
Start the local task server (in one terminal):
render workflows dev -- render-workflows workflows.main:app
The
render-workflowsCLI discovers tasks from theappinstance inworkflows/main.py. -
Run the API service (in another terminal):
cd api && flask run
The app loads settings from
.envautomatically.
For more details, see the Workflows local development guide.
├── workflows/
│ ├── main.py # Workflow task definitions
│ └── analyzers.py # SEO analysis functions
├── api/
│ └── app.py # Flask API
├── requirements.txt
├── render.yaml # Blueprint for API service
└── README.md
- User submits a URL via the frontend
- API service triggers the
audit_siteworkflow task audit_sitecallscrawl_pagesto discover pages (sitemap or link crawling)- For each discovered page,
audit_sitespawns ananalyze_pagetask - Each
analyze_pageruns independently on its own instance - Results are aggregated and returned to the frontend
This demonstrates Workflows' key capability: distributing work across many instances with automatic orchestration, retries, and observability.
| Method | Endpoint | Description |
|---|---|---|
GET |
/ |
Health check |
POST |
/audit |
Start an audit (body: {"url": "...", "max_pages": 25}) |
GET |
/audit/<id> |
Get audit status and results |
GET |
/health |
Health check |