Visual Workflow Automation Platform
Build, trigger, and run multi-step automations with a drag-and-drop editor β powered by a Next.js frontend and a BullMQ job worker.
- Overview
- Architecture
- Tech Stack
- Workflow Nodes
- Data Models
- Local Development
- Environment Variables
- Database Migrations
- Deployment (Render)
- Project Structure
Aurel is a no-code/low-code workflow automation platform. Users can visually design multi-step workflows using a drag-and-drop canvas (powered by React Flow), wire up nodes, and trigger them via webhooks. Workflows execute asynchronously through a BullMQ job queue backed by Redis, with full per-node execution logs stored in PostgreSQL.
Key capabilities:
- π±οΈ Visual drag-and-drop workflow editor
- π Webhook triggers per workflow (unique secret per workflow)
- π§ Send emails via Resend
- π Make arbitrary HTTP requests
- π Conditional branching (
ifnode with operators:=,contains,>,<,exists) - π Set and transform data between nodes
- π Full execution logs with per-node status tracking
- π OAuth authentication (GitHub & Google) via NextAuth v5
Web requests enter through apps/web, jobs flow through Redis/BullMQ, and apps/worker executes workflows while persisting state in PostgreSQL via Prisma.
| Layer | Technology |
|---|---|
| Frontend Framework | Next.js 16 (App Router) |
| UI Library | React 19 + shadcn/ui + Radix UI |
| Styling | Tailwind CSS v4 |
| Animations | Framer Motion, GSAP, motion |
| 3D / Effects | Three.js, React Three Fiber, OGL |
| Workflow Canvas | React Flow (@xyflow/react) |
| State Management | Zustand |
| Data Fetching | SWR |
| Authentication | NextAuth v5 (GitHub + Google OAuth) |
| Job Queue | BullMQ + IORedis |
| Database ORM | Prisma |
| Database | PostgreSQL |
| Resend | |
| HTTP Client | Axios |
| Package Manager | pnpm (Workspaces) |
| Language | TypeScript 5 |
Each node in a workflow has a type and configurable data. The worker resolves them at execution time.
| Node Type | Description |
|---|---|
trigger / webhook |
Entry point of a workflow. Workflows expose a unique POST /api/webhooks/:id endpoint that queues a job with the request body as triggerData. |
email |
Sends an HTML email via the Resend API. Supports template interpolation from previous node outputs ({{field.path}}). |
http |
Makes an arbitrary HTTP request (GET, POST, PUT, PATCH, DELETE) and passes the response body to the next node. |
if |
Conditional branching. Evaluates a field on the current data payload against a value using operators: =, contains, >, <, exists. Routes to true or false branches. |
set |
Sets or transforms data fields on the payload before passing it to the next node. |
model User {
id String @id @default(cuid())
email String @unique
name String?
image String?
workflows Workflow[]
createdAt DateTime @default(now())
}
model Workflow {
id String @id @default(cuid())
name String
userId String
nodes Json // React Flow nodes array
edges Json // React Flow edges array
active Boolean @default(false)
webhookSecret String @default(cuid())
executions Execution[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Execution {
id String @id @default(cuid())
workflowId String
status String // "queued" | "running" | "success" | "failed"
input Json // trigger payload
logs Json // per-node results array
startedAt DateTime @default(now())
endedAt DateTime?
}git clone https://github.com/your-org/aurel-monorepo.git
cd aurel-monorepo
pnpm installStart local PostgreSQL and Redis using Docker Compose:
docker compose up -dStop services:
docker compose downStop and remove all data volumes:
docker compose down -vCopy and fill in the required variables (see Environment Variables):
# For the web app
cp apps/web/.env.local.example apps/web/.env.local
# For the worker
cp apps/worker/.env.example apps/worker/.env
# For the database package
cp packages/db/.env.example packages/db/.envpnpm db:migrate:deploy
pnpm db:generateRun the web app and worker in separate terminals:
# Terminal 1 β Next.js web app
pnpm dev:web
# Terminal 2 β BullMQ background worker
pnpm dev:worker| Variable | Description |
|---|---|
DATABASE_URL |
PostgreSQL connection string |
REDIS_URL |
Redis connection string (e.g. redis://localhost:6379) |
REDIS_HOST |
Redis host (alternative to REDIS_URL) |
REDIS_PORT |
Redis port (default: 6379) |
REDIS_PASSWORD |
Redis password (optional) |
NEXTAUTH_SECRET |
Secret for signing NextAuth session tokens |
NEXTAUTH_URL |
Canonical URL of the app (e.g. http://localhost:3000) |
GITHUB_ID |
GitHub OAuth App Client ID |
GITHUB_SECRET |
GitHub OAuth App Client Secret |
GOOGLE_CLIENT_ID |
Google OAuth 2.0 Client ID |
GOOGLE_CLIENT_SECRET |
Google OAuth 2.0 Client Secret |
| Variable | Description |
|---|---|
DATABASE_URL |
PostgreSQL connection string |
REDIS_URL |
Redis connection string |
REDIS_HOST |
Redis host (alternative to REDIS_URL) |
REDIS_PORT |
Redis port |
REDIS_PASSWORD |
Redis password (optional) |
RESEND_API_KEY |
Resend API key for sending emails |
RESEND_FROM_EMAIL |
Default sender address (e.g. noreply@yourdomain.com) |
Run Prisma migrations against the configured DATABASE_URL:
# Apply pending migrations
pnpm db:migrate:deploy
# Regenerate Prisma client after schema changes
pnpm db:generateWhen making schema changes, create a new migration:
pnpm --filter @aurel/db exec prisma migrate dev --name <migration-name>Deploy two separate services from this monorepo on Render.
- Render PostgreSQL β copy the internal connection string as
DATABASE_URL - Render Redis β copy the internal
REDIS_URL
| Setting | Value |
|---|---|
| Type | Web Service |
| Root Directory | (repo root) |
| Build Command | pnpm install --frozen-lockfile && pnpm run db:generate && pnpm --filter web build |
| Start Command | pnpm --filter web start |
| Environment Variables | See Web App env vars |
| Setting | Value |
|---|---|
| Type | Background Worker |
| Root Directory | (repo root) |
| Build Command | pnpm install --frozen-lockfile && pnpm run db:generate |
| Start Command | pnpm --filter worker start |
| Environment Variables | See Worker env vars |
Add a pre-deploy job or run once manually:
pnpm --filter @aurel/db exec prisma migrate deployaurel-monorepo/
βββ apps/
β βββ web/ # Next.js 16 App Router frontend
β β βββ app/
β β β βββ api/ # API routes (workflows, executions, webhooks, emails)
β β β βββ dashboard/ # Dashboard page
β β β βββ editor/ # Visual workflow editor (React Flow)
β β β βββ executions/ # Execution history & logs viewer
β β β βββ docs/ # Documentation pages
β β βββ components/ # Shared UI components (shadcn/ui)
β β βββ store/ # Zustand stores
β β βββ lib/ # Utility functions
β β
β βββ worker/ # BullMQ background worker
β βββ engine/ # Core workflow execution engine
β βββ executors/ # Node executors (email, http, if, set, webhook)
β βββ utils/ # Helpers (e.g. template resolution)
β βββ index.ts # Worker entry point
β
βββ packages/
βββ db/ # Shared Prisma DB package (@aurel/db)
βββ prisma/
βββ schema.prisma # Database schema (User, Workflow, Execution)
Built with β€οΈ using Next.js, BullMQ, Prisma, and React Flow.
