Design workflows. Connect exchanges. Automate trades.
Trading automation platform, which is a workflow-driven platform that is designed for full-stack development and uses Turborepos monorepo architecture. Users design workflows using visual drag-and-drop functionality to connect triggers (alert on price changes, timer), actions (orders at exchanges), and notifications (email, Telegram).
Key technical achievements to feature on your resume:
| Area | Highlight |
|---|---|
| Architecture | Designed and built a production-grade Turborepo monorepo with 3 apps and 4 shared packages, enforcing strict code sharing boundaries |
| Visual Workflow Builder | Implemented a drag-and-drop DAG editor using React Flow, allowing users to compose complex trading strategies without writing code |
| DAG Execution Engine | Built a custom directed acyclic graph (DAG) runner with topological traversal, fail-fast error handling, and full execution audit trail |
| Exchange Integration | Integrated real-time order execution via the Lighter exchange SDK (Bun FFI to native signer library), with a pluggable adapter pattern for multi-exchange support |
| Real-Time Market Data | Consumed Binance API for live price tickers with real-time updates; CoinGecko used for trigger price evaluation with a 15-second TTL cache |
| Type-Safe Shared Schemas | Enforced end-to-end type safety using Zod schemas shared across frontend, backend, and executor via a common package |
| Auth System | Implemented JWT-based authentication with bcrypt password hashing, protected routes, and token persistence |
| Notification System | Built transactional email notifications using Resend + React Email with HTML-rendered templates |
| CI/CD Pipeline | Set up GitHub Actions CI with lint, format, type-check, and build stages leveraging Turbo cache for fast incremental builds |
| Modern Stack | React 19, TypeScript, Tailwind CSS 4, Vite 8, Express 5, Bun runtime, MongoDB + Mongoose |
User builds workflow in UI --> Backend saves it to MongoDB --> Executor polls & runs it
- Design a workflow in the browser using the drag-and-drop node editor (React Flow).
- Connect trigger nodes (price threshold, timer interval) to action nodes (Lighter, Hyperliquid, Backpack) and notification nodes (email, Telegram).
- Save the workflow via the REST API.
- Execute — the background executor picks it up, continuously evaluates trigger conditions, and fires the action chain when conditions are met.
- Monitor every execution (status, timing, errors) on the executions dashboard.
apps/
client/ React 19 + TypeScript + Vite 8 + Tailwind 4 + shadcn/ui + React Flow
backend/ Bun + Express 5 REST API + JWT auth
executor/ Bun background worker — trigger poller & DAG runner
packages/
common/ Shared Zod schemas, TypeScript types, asset metadata
db/ Mongoose models (User, Workflow, Execution)
lighter-sdk-ts/ TypeScript SDK for Lighter.xyz exchange (Bun FFI native signer)
eslint-config/ Shared ESLint configuration
┌─────────────┐ create/update ┌───────────┐ read/write ┌─────────┐
│ Client │ ──────────────▶ │ Backend │ ─────────────▶ │ MongoDB │
│ (React 19) │ view results │ (Express) │ │ │
└─────────────┘ ◀────────────── └───────────┘ ◀───────────── └─────────┘
│ ▲
load │ │ write
workflows │ │ results
▼ │
┌──────────┐
│ Executor │
│ (Bun) │
└──────────┘
│
┌──────────────┼──────────────┐
▼ ▼ ▼
CoinGecko Lighter Resend
(prices) (orders) (email)
- Drag-and-drop node graph powered by React Flow (@xyflow/react)
- Pre-built workflow templates (SOL Price Breakout, BTC DCA Timer, ETH Cascade)
- Real-time workflow toggle (active/inactive)
| Type | Metadata | Fires when |
|---|---|---|
| Price Trigger | asset, price |
Market price crosses the threshold (CoinGecko with 15s cache) |
| Timer | time (seconds) |
Every N seconds since last fire |
| Exchange | Status | Details |
|---|---|---|
| Lighter | Fully implemented | Real orders via lighter-sdk-ts with Bun FFI native signer |
| Hyperliquid | Adapter stub | Pluggable — ready for SDK integration |
| Backpack | Adapter stub | Pluggable — ready for SDK integration |
Supported assets: SOL, BTC, ETH
| Channel | Status | Details |
|---|---|---|
| Implemented | Resend API + React Email HTML templates | |
| Telegram | UI ready | Node available in editor, executor handler planned |
- Topological sort traversal of workflow graph
- Fail-fast execution — halts action chain on first failure
- Full audit trail: every node execution recorded as PENDING → COMPLETED or FAILED
- Configurable poll interval (
EXECUTOR_POLL_INTERVAL_MS) - Graceful shutdown on SIGINT / SIGTERM
- JWT-based auth with bcrypt password hashing
- Protected routes on frontend with token persistence
- Stateless REST API with
Authorizationheader
- Real-time price ticker consuming Binance 24hr API for BTC, ETH, SOL
- Dark/light theme toggle
- Responsive modern UI with shadcn/ui components
| Layer | Technology |
|---|---|
| Runtime | Bun v1.3+ |
| Frontend | React 19, TypeScript, Vite 8, Tailwind CSS 4, shadcn/ui, Radix, React Flow |
| Backend | Express 5, JWT, bcrypt |
| Database | MongoDB + Mongoose |
| Validation | Zod (shared schemas across all apps) |
| Resend + @react-email/render | |
| Exchange | Lighter SDK (Bun FFI), Hyperliquid, Backpack |
| Market Data | CoinGecko API, Binance API |
| Monorepo | Turborepo + Bun workspaces |
| CI/CD | GitHub Actions (lint, format, type-check, build with Turbo cache) |
| Routing | React Router v7 |
- Bun v1.3+
- A running MongoDB instance
bun installCreate a .env file in the project root:
MONGO_URI=mongodb://localhost:27017/tradingflow
JWT_SECRET=your-secret-here
# Optional
VITE_API_BASE_URL=http://localhost:3000
CORS_ORIGIN=http://localhost:5173
EXECUTOR_POLL_INTERVAL_MS=10000bun run devThis starts all three apps via Turborepo:
| App | URL / Port | Description |
|---|---|---|
| client | http://localhost:5173 |
React UI |
| backend | http://localhost:3001 |
REST API |
| executor | background process | Workflow poller & DAG runner |
bun run dev # Client only
bun run dev # Backend only
cd apps/executor && bun run dev # Executor only| Method | Path | Auth | Description |
|---|---|---|---|
POST |
/signup |
No | Create a new account |
POST |
/signin |
No | Sign in, receive JWT |
GET |
/workflow |
Yes | List user's workflows |
GET |
/workflow/:id |
Yes | Get a single workflow |
POST |
/workflow |
Yes | Create a new workflow |
PUT |
/workflow/:id |
Yes | Update existing workflow |
PATCH |
/workflow/:id/toggle |
Yes | Toggle workflow active/inactive |
DELETE |
/workflow/:id |
Yes | Delete a workflow |
GET |
/workflow/execution/:id |
Yes | List executions for a workflow |
The executor is a long-lived Bun process that:
- Connects to MongoDB on startup
- Polls all active workflows every 10 seconds (configurable)
- Evaluates trigger nodes — price triggers check live prices via CoinGecko (15s TTL cache), timer triggers fire on interval
- When a trigger fires, walks the workflow DAG in topological order and executes each downstream action/notification node
- Records every node execution in the
Executioncollection (PENDING → COMPLETED or FAILED) - Halts the action chain on the first failure — the failed node is recorded and downstream nodes are skipped
- Shuts down gracefully on SIGINT / SIGTERM
├── apps/client/src/
│ ├── pages/
│ │ ├── WorkflowDetailsPage.tsx # React Flow visual editor
│ │ └── DashboardPage.tsx # Workflow list + templates
│ ├── components/
│ │ ├── nodes/ # Custom trigger/action/notification nodes
│ │ └── PriceTicker.tsx # Live Binance price feed
│ └── lib/
│ └── api-client.ts # Type-safe API client class
│
├── apps/executor/
│ ├── graph-runner.ts # DAG execution engine
│ ├── trigger-evaluator.ts # Price & timer trigger logic
│ ├── exchange-adapters/ # Pluggable exchange integration
│ └── notification-handlers/ # Email & notification dispatch
│
└── packages/common/
├── schemas.ts # Shared Zod validation schemas
└── types.ts # Shared TypeScript types
