A website SEO analysis tool demonstrating Render Workflows for distributed task execution.
Warning
Render Workflows is currently in early access. The API and SDK may introduce breaking changes. Public beta coming soon.
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
This demo consists of three services:
┌─────────────────┐ ┌─────────────────┐ ┌──────────────────────────────┐
│ Frontend │ │ API Service │ │ Workflow Service │
│ (Static Site) │ │ (Python or TS) │ │ │
│ │ │ │ │ │
│ React + Vite ──────▶│ POST /audit ──────▶│ audit_site task │
│ │ │ │ SDK │ │ │
│ Results UI ◀────────│ GET /audit/:id ◀──── │ ▼ │
│ │ │ │ │ crawl_pages task │
└─────────────────┘ └─────────────────┘ │ │ │
│ ▼ │
│ ┌────────────────────────┐ │
│ │ analyze_page (×N) │ │
│ │ ... parallel tasks │ │
│ └────────────────────────┘ │
└──────────────────────────────┘
├── frontend/ # React frontend (shared by both backends)
│ ├── src/
│ └── render.yaml # Blueprint for static site
├── python/ # Python implementation
│ ├── api/ # Flask API
│ ├── workflow/ # Workflow tasks
│ └── render.yaml # Blueprint for API service
└── typescript/ # TypeScript implementation
├── api/ # Express API
├── workflow/ # Workflow tasks
└── render.yaml # Blueprint for API service
You need to deploy 3 services:
Workflows are created via the Render Dashboard (not render.yaml):
- Go to the Render Dashboard
- Select New > Workflow
- Connect your repository
- Configure:
- Name:
seo-audit-workflow(this becomes your workflow slug) - Root Directory:
python/workflowortypescript/workflow - Build Command: See language-specific README
- Start Command: See language-specific README
- Name:
- Deploy the workflow
Choose Python or TypeScript:
| Language | Root Directory | Build Command | Start Command |
|---|---|---|---|
| Python | python |
pip install -r requirements.txt |
gunicorn --chdir api app:app |
| TypeScript | typescript |
npm install && npm run build |
node dist/api/index.js |
- Go to the Render Dashboard
- Select New > Web Service
- Connect your repository
- Configure using the table above
- Add environment variables:
RENDER_API_KEY: Your Render API keyWORKFLOW_SLUG: The name of your workflow (e.g.,seo-audit-workflow)WORKFLOW_ID: The workflow ID (e.g.,wfl-xxxxx) for task discovery in the UI
- Deploy and note the service URL (e.g.,
https://seo-audit-api-py.onrender.com)
- Go to the Render Dashboard
- Select New > Static Site
- Connect your repository
- Configure:
- Name:
seo-audit-frontend - Root Directory:
frontend - Build Command:
npm install && npm run build - Publish Directory:
dist
- Name:
- Add environment variable:
VITE_API_URL: Auto-populated from the API service host inrender.yaml- You can override it with a full URL if needed
- Deploy
cd frontend
npm install
npm run devSee the language-specific READMEs for backend setup:
- User submits a URL via the frontend
- Frontend calls the API service (
POST /audit) - API triggers the
audit_siteworkflow task audit_sitespawnscrawl_pagesto discover pages (via sitemap or link crawling)- For each discovered page,
audit_sitespawns ananalyze_pagetask - Each
analyze_pageruns independently on its own compute instance - Results are aggregated and returned via the API to the frontend
This demonstrates Workflows' key capability: distributing work across many instances with automatic orchestration, retries, and observability.
Note
Workflow concurrency limits vary by plan: Hobby (5), Pro (25), Org (100). These limits may change after beta.
| 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 |