MeshHook — Mesh your webhooks. Orchestrate everything.
MeshHook is an MIT-licensed, webhook-first workflow engine with a visual builder (SvelteKit/Svelte 5) and Temporal-like durability via event sourcing on Postgres (Supabase).
Stack
- UI/API: SvelteKit (Svelte 5)
- DB/Queues/Realtime/Storage: Supabase (Postgres, Realtime, Storage)
- Workers: Node.js (or Bun), stateless
- Queue: pg-boss or pgmq (Postgres-native)
- Transforms: JMESPath ## Why MeshHook?
| Feature | n8n | Windmill | Temporal | MeshHook |
|---|---|---|---|---|
| License | Fair-code (restrictive) | AGPLv3 | MIT | MIT |
| Primary Use Case | No-code automation | Script orchestration | Microservice workflows | Webhook-first workflows |
| Durability | Database polling | Database + queues | Custom event sourcing | Event sourcing on Postgres |
| Visual Builder | ✅ Drag-and-drop | ❌ Code-first | ❌ Code-first | ✅ Visual + Code |
| Webhook-Native | ⚠️ Supported | ⚠️ Supported | ❌ Not primary | ✅ Built-in |
| Self-Hosted | ✅ Yes | ✅ Yes | ✅ Yes | ✅ Yes |
| Database | MySQL/Postgres | Postgres | Custom | Postgres (Supabase) |
| Transforms | JavaScript | TypeScript/Python | Any language | JMESPath |
| Realtime Logs | ❌ Polling | ❌ Polling | ❌ Polling | ✅ Supabase Realtime |
| Deployment | Complex (multiple services) | Complex (workers + API) | Complex (server + workers) | Simple (single service) |
| Learning Curve | Low (no-code) | Medium (scripts) | High (SDK required) | Low (visual + simple) |
MeshHook's Sweet Spot
- Webhook-first: Built specifically for webhook orchestration and transformation
- Simple deployment: Single service on one port, no complex infrastructure
- MIT licensed: Truly open source, use anywhere without restrictions
- Event sourcing: Temporal-like durability without the complexity
- Visual + Code: Low-code visual builder with JMESPath for power users
- Postgres-native: Leverage Supabase for database, queues, realtime, and storage
Quick Start
Local Development
Install dependencies
pnpm installSetup environment (interactive)
pnpm run setupSelect "Local Development" when prompted. This creates
.env.localwith Supabase local defaults.Start Supabase locally
pnpx supabase startRun migrations
pnpm run db:migrateStart the orchestrator
pnpm run startRuns on port 8080 (configurable via PORT environment variable)
Production / Staging
Install dependencies
pnpm installSetup environment (interactive)
pnpm run setupSelect "Production" or "Staging" and enter your Supabase credentials.
Run migrations
pnpm run db:migrateAutomatically detects environment and pushes migrations to remote database.
Start the server
pnpm run startRuns on port 8080 by default. Configure your reverse proxy to forward traffic to this port.
Available Commands
pnpm run setup- Interactive environment configuration (local/staging/production)pnpm run db:migrate- Run database migrations (auto-detects environment)pnpm run start- Start the orchestrator worker (production)pnpm mh --help- CLI help
Environment Files
.env.local- Local development (committed to repo with safe defaults).env.staging- Staging environment (not committed).env.production- Production environment (not committed).env- Symlink to active environment (created by setup script)
Documentation
./docs/Environment-Setup.md- Detailed environment setup guide./docs/Event-Partitioning.md- Event partitioning strategy and maintenance./docs/PRD.md- Product requirements./docs/Architecture.md- System architecture./docs/diagrams/*.puml- PlantUML diagrams
Architecture
MeshHook runs as a single service on port 8080 that handles:
- Webhook intake and processing
- Workflow orchestration
- Background job execution
- HTTP request execution with retries
All components communicate via Supabase (Postgres) - no inter-service HTTP calls needed.
Built With
- node.js
- supabase
- svelte
Log in or sign up for Devpost to join the conversation.