A collaborative productivity platform built with React, Node.js, PostgreSQL, WebRTC, and Ethereum.
| Layer | Technologies |
|---|---|
| Frontend | React, Vite, TypeScript, Tailwind CSS, TanStack Query, Zustand, WebRTC |
| Backend | Node.js, Express, Prisma, JWT, bcrypt, Socket.IO, ethers.js |
| Database | PostgreSQL |
| Blockchain | Solidity, Hardhat, TaskEventLedger |
- Node.js 20+
- PostgreSQL 14+
npm installcp server/.env.example server/.env
cp client/.env.example client/.envEdit server/.env with your PostgreSQL connection string and a secure JWT secret (min 16 characters).
npm run db:pushnpm run dev- Frontend: http://localhost:5173
- Backend API: http://localhost:3001
By default the app uses local ledger mode (append-only PostgreSQL records with deterministic hashes). To anchor events on a local Ethereum node:
# Terminal A — local chain
npm run chain:node
# Terminal B — deploy contract
npm run chain:deployThen set in server/.env:
BLOCKCHAIN_RPC_URL=http://127.0.0.1:8545
BLOCKCHAIN_PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
TASK_EVENT_LEDGER_ADDRESS=<address from blockchain/deployments/localhost.json>
Restart the API. Ledger mode switches to on-chain.
taskflow/
├── client/ # React frontend (Vite)
├── server/ # Express API + Prisma + WebRTC signaling
├── blockchain/ # Hardhat + TaskEventLedger.sol
├── docs/
│ └── PROJECT.md # Full project specification
└── package.json # npm workspaces root
- V1: Auth, Dashboard, Tasks, Categories, Statistics, Profile
- V2: Connections, Shared Tasks, Messages, Notifications, Online Presence
- V3 ✅: Voice Calls (WebRTC), Blockchain Task Event Ledger
- Audio-only WebRTC between connections (1:1 from Messages)
- Socket.IO signaling: invite / accept / reject / offer / answer / ICE
- Incoming call overlay + mute / end controls
Immutable append-only events (never edit/delete/overwrite):
TASK_CREATEDTASK_COMPLETEDTASK_REOPENED(requires reason; completion history kept)TASK_ARCHIVEDPRIORITY_UPDATEDDEADLINE_UPDATED
Hybrid architecture: PostgreSQL for queries + optional on-chain anchoring via TaskEventLedger.
See docs/PROJECT.md for the full specification.