Nodeflow is a modern workflow automation platform that allows developers and teams to connect APIs, services, and databases to automate repetitive tasks and build powerful event-driven workflows.
Inspired by tools like n8n and Zapier, Nodeflow provides a visual workflow builder where users can design automation pipelines, trigger actions based on events, and integrate multiple services without complex coding.
- 🖼️ Visual Workflow Editor — Drag-and-drop canvas with node connections, minimap, snap-to-grid, and dark/light mode support
- ⚡ Trigger Nodes — Kick off workflows via Manual Trigger, Google Form submissions, or Stripe webhook events
- 🔗 Action Nodes — HTTP Request, Discord message, Slack message
- 🤖 AI Nodes — Generate text with Gemini, OpenAI, or Anthropic using stored API credentials
- 📝 Dynamic Templating — Use Handlebars templates in prompts and HTTP bodies to reference outputs from previous nodes (e.g.
{{googleForm.responses}}) - 🔀 Topological Execution — Nodes execute in dependency order via Inngest with real-time status updates per node
- 🔐 Credential Vault — Store and manage encrypted API keys (AES via Cryptr) per user
- 🛡️ Authentication — Email/password, GitHub, and Google OAuth via Better Auth
- 💳 Subscription & Billing — Polar-powered checkout, billing portal, and premium-gated workflow creation
- 📊 Execution History — Browse past runs with status (running / success / failed), output data, and error traces
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router, React 19, RSC) |
| Language | TypeScript |
| Styling | Tailwind CSS 4, shadcn/ui (New York), Radix UI |
| State | Jotai (editor), nuqs (URL search params), TanStack React Query |
| API | tRPC v11 (superjson) |
| Database | PostgreSQL + Prisma 7 |
| Auth | Better Auth (email/password + GitHub + Google OAuth) |
| Workflow Engine | Inngest (durable functions, retries, real-time channels) |
| AI | Vercel AI SDK (Gemini, OpenAI, Anthropic) |
| Payments | Polar (checkout, subscriptions, billing portal) |
| Node Editor | @xyflow/react (React Flow) |
| Linting | Biome |
| Tunneling | ngrok (webhook development) |
- Node.js >= 20
- pnpm (package manager)
- PostgreSQL database
- Inngest CLI (bundled via
inngest-clidependency) - ngrok (optional, for webhook development)
git clone https://github.com/<your-username>/nodeflow.git
cd nodeflowpnpm installCreate a .env file at the project root:
# Database
DATABASE_URL="postgresql://user:password@localhost:5432/nodeflow"
# Auth
BETTER_AUTH_SECRET="your-secret"
GITHUB_CLIENT_ID="..."
GITHUB_CLIENT_SECRET="..."
GOOGLE_CLIENT_ID="..."
GOOGLE_CLIENT_SECRET="..."
# Encryption (for credential vault)
ENCRYPTION_KEY="your-32-char-encryption-key"
# Inngest
INNGEST_EVENT_KEY="..."
INNGEST_SIGNING_KEY="..."
# Polar (payments)
POLAR_ACCESS_TOKEN="..."
POLAR_PRODUCT_ID="..."
POLAR_SUCCESS_URL="http://localhost:3000"
# ngrok (optional)
NGROK_URL="your-ngrok-url"pnpm prisma migrate devRun all services (Next.js dev server, Inngest dev server, ngrok) concurrently:
pnpm dev:allOr start services individually:
pnpm dev # Next.js
pnpm inngest:dev # Inngest dev server
pnpm ngrok:dev # ngrok tunnelOpen http://localhost:3000 in your browser.
src/
├── app/ # Next.js App Router pages & API routes
│ ├── (auth)/ # Login & register pages
│ ├── (dashboard)/ # Dashboard layouts (editor + rest)
│ └── api/ # tRPC, Inngest, auth & webhook routes
├── components/ # Shared UI & React Flow node components
├── config/ # Constants & node component registry
├── features/ # Feature modules
│ ├── auth/ # Auth forms
│ ├── credentials/ # Credential CRUD & encrypted storage
│ ├── editor/ # Workflow canvas editor
│ ├── executions/ # Execution history & node executors
│ │ └── components/
│ │ ├── anthropic/ # Anthropic AI node
│ │ ├── discord/ # Discord action node
│ │ ├── gemini/ # Gemini AI node
│ │ ├── http-request/ # HTTP request node
│ │ ├── openai/ # OpenAI node
│ │ └── slack/ # Slack action node
│ ├── subscriptions/ # Polar subscription hooks
│ ├── triggers/ # Trigger node implementations
│ │ └── components/
│ │ ├── google-form-trigger/
│ │ ├── manual-trigger/
│ │ └── stripe-trigger/
│ └── workflows/ # Workflow CRUD & listing
├── inngest/ # Inngest workflow execution engine
│ ├── channels/ # Real-time status channels per node type
│ ├── lib/ # Executor registry & types
│ └── functions.ts # Main executeWorkflow function
├── lib/ # Auth, DB, encryption, Polar client
└── trpc/ # tRPC router, client & server setup
- Manual Trigger — Execute workflow on demand from the editor
- Google Form Trigger — Webhook-triggered on form submission
- Stripe Trigger — Webhook-triggered on Stripe events
- HTTP Request — Make GET/POST/PUT/DELETE/PATCH requests with templated URLs and bodies
- Discord — Send messages to Discord channels
- Slack — Send messages to Slack channels
- Gemini — Generate text using Google Gemini (with system + user prompts)
- OpenAI — Generate text using OpenAI models
- Anthropic — Generate text using Anthropic Claude models
| Command | Description |
|---|---|
pnpm dev |
Start Next.js dev server |
pnpm build |
Generate Prisma client & build for production |
pnpm start |
Start production server |
pnpm dev:all |
Start all services via mprocs |
pnpm inngest:dev |
Start Inngest dev server |
pnpm ngrok:dev |
Start ngrok tunnel |
pnpm lint |
Run Biome linter |
pnpm format |
Format code with Biome |
This project is open source. See the LICENSE file for details.