Self-hostable workflow automation platform
Open-source workflow automation platform. Build, run, and monitor multi-step automations with a visual node editor.
Watch the product demo on X: https://x.com/Abhinavstwt/status/2025449306564821163?s=20
Fynt is a self-hostable workflow automation platform. You drag nodes onto a canvas, wire them together, and let the engine execute them. Runs are distributed through a job queue, streamed live to the browser over WebSockets, and all credentials are encrypted at rest.
What you can build:
Visual system design:
| Category | Nodes |
|---|---|
| Triggers | Manual, Webhook, Cron |
| AI | OpenAI, Anthropic, Gemini |
| Integrations | HTTP Request, GitHub, Notion, Slack, Discord |
| Logic | Condition, Filter |
| Utilities | Transform, Delay, Log |
fynt/
apps/
web/ Next.js frontend, tRPC API, workflow builder UI
worker/ BullMQ job processor and cron scheduler
realtime/ WebSocket relay server for live execution events
packages/
prisma/ Database schema, migrations, Prisma client
shared/ Redis, queue, crypto, and runtime utilities
eslint-config/ Shared ESLint rules| Mode | Deploy | Use when |
|---|---|---|
| Web only | apps/web |
You want to show the UI only and do not want to run worker and realtime services |
| Full self-host | apps/web + apps/worker + apps/realtime |
You want real workflow execution, cron scheduling, webhook ingestion, and live run streaming |
Run the full stack locally with one command:
cp .env.docker.example .env.docker
# fill required secrets in .env.docker
docker compose up --buildServices:
http://localhost:3000http://localhost:3101/healthlocalhost:55432 (default; configurable via FYNT_POSTGRES_PORT)localhost:6379Operational commands:
# stop containers
docker compose down
# stop + remove data volumes
docker compose down -v
# stream logs
docker compose logs -f web worker realtime bootstrapNotes:
FYNT_RUNTIME_MODE=full) with automation enabled..env.docker; apps/web/.env is not required for Docker runtime.git clone https://github.com/your-org/fynt.git
cd fynt
pnpm installcp .env.example .envUse .env.example as the source of truth.
Required for both modes:
DATABASE_URL=postgresql://...
BETTER_AUTH_URL=http://localhost:3000
BETTER_AUTH_SECRET=...
ENCRYPTION_KEY=...
# Runtime mode for server-side guards
FYNT_RUNTIME_MODE=web-only # use full for full self-host mode
# Runtime mode for client-side execute button behavior
NEXT_PUBLIC_FYNT_RUNTIME_MODE=web-only # use full for full self-host modeRequired for full self-host mode:
# Option A (recommended, works with Upstash too)
REDIS_URL=redis://... # or rediss://...
# Option B
REDIS_HOST=localhost
REDIS_PORT=6379
NEXT_PUBLIC_EXECUTION_WS_URL=ws://localhost:3101
EXECUTION_WS_URL=ws://localhost:3101
REALTIME_HOST=0.0.0.0
REALTIME_PORT=3101pnpm --filter @repo/prisma exec prisma migrate dev
pnpm db:seedpnpm db:seed inserts baseline records like available triggers/actions required by workflow creation.
Web only mode:
# Keep builder UX enabled and block execution APIs + execute actions
FYNT_RUNTIME_MODE=web-only NEXT_PUBLIC_FYNT_RUNTIME_MODE=web-only pnpm --filter @fynt/web devOr set those two env vars in your deploy platform and run:
pnpm --filter @fynt/web devFull self-host mode:
pnpm devFYNT_RUNTIME_MODE=web-only blocks:If you run full self-host in production, set:
FYNT_RUNTIME_MODE=full
NEXT_PUBLIC_FYNT_RUNTIME_MODE=full
FYNT_ENABLE_AUTOMATION_IN_PRODUCTION=true# Start everything
pnpm dev
# Run a single service
pnpm --filter @fynt/web dev
pnpm --filter @fynt/worker dev
pnpm --filter @fynt/realtime dev
# Type checking
pnpm check-types
# Linting
pnpm lint
# Database
pnpm db:generate # regenerate Prisma client
pnpm db:push # push schema without migrations
pnpm db:seed # seed with sample dataNo open issues yet, or sync has not completed.