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 │
│ (Express) │ │ │
│ │ │ │
│ Frontend ────────────────▶ audit_site task │
│ │ SDK │ │ │
│ Results ◀─────────────│ ▼ │
│ │ │ 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
- Node.js 20+
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-ts - Root Directory:
typescript - Build Command:
npm install && npm run build - Start Command:
node dist/workflows/index.js
- 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-ts)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-ts - Runtime: Node
- Build Command:
npm install && npm run build - Start Command:
node dist/api/index.js
- Name:
- Add the environment variables listed above
See the main README for frontend deployment instructions. The frontend is shared between Python and TypeScript backends.
-
Install dependencies:
npm install
-
Build the project:
npm run build
-
Set environment variables:
export RENDER_API_KEY=your-api-key export RENDER_USE_LOCAL_DEV=true export WORKFLOW_SLUG=seo-audit-workflow-ts export WORKFLOW_ID=wfl-xxxxx
-
Start the local task server (in one terminal):
render workflows dev -- node dist/workflows/index.js
-
Run the API service (in another terminal):
npm run dev
For more details, see the Workflows local development guide.
├── workflows/
│ ├── index.ts # Workflow task definitions
│ └── analyzers.ts # SEO analysis functions
├── api/
│ └── index.ts # Express API
├── package.json
├── tsconfig.json
├── render.yaml # Blueprint for API service
└── README.md
- User submits a URL via the frontend
- API service triggers the
audit_siteworkflow task using@renderinc/sdk 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 |
This demo uses the official @renderinc/sdk package which provides:
- Task Definition: Register tasks with
task()function - REST API Client: Run and monitor tasks with
Renderclient - Type Safety: Full TypeScript support with IntelliSense
- Retry Logic: Configurable retry behavior for tasks
- Task Spawning: Execute tasks from within other tasks