A modern, full-stack task marketplace built with Next.js 14, Supabase, and Paystack. A significantly improved clone of SariCloud.com.
| Layer | Technology |
|---|---|
| Framework | Next.js 14 (App Router) |
| Language | TypeScript |
| Styling | Tailwind CSS |
| Database | Supabase (PostgreSQL) |
| Auth | Supabase Auth |
| Real-time | Supabase Realtime |
| Payments | Paystack (KES + USD) |
| Deployment | Vercel |
| Feature | SariCloud | TaskCloud |
|---|---|---|
| Task listing | ✅ Basic | ✅ Advanced with filters/search |
| Task detail | ✅ Basic | ✅ Full with applications |
| Auth (signup/login) | ✅ PHP session | ✅ Supabase JWT |
| Dashboard | ✅ Basic | ✅ Full with stats |
| Bidding/Applications | ❌ | ✅ Full bid system |
| Messaging | Mentioned | ✅ Real-time chat |
| Wallet | ❌ | ✅ Full wallet + history |
| Paystack (KES) | Unknown | ✅ KES + USD |
| Escrow system | Described | ✅ Built-in |
| Submissions | ❌ | ✅ Submit & approve flow |
| Ratings/Reviews | Mentioned | ✅ Star ratings |
| Category filtering | ❌ | ✅ 12 categories |
| Mobile responsive | Basic | ✅ Mobile-first |
| Real-time updates | ❌ | ✅ Supabase Realtime |
| Notifications | ❌ | ✅ In-app notifications |
| Withdrawal | ❌ | ✅ M-Pesa withdrawal |
| Paystack webhook | ❌ | ✅ Secure webhook handler |
npm install- Create a project at supabase.com
- Go to SQL Editor and run the contents of
supabase-schema.sql - Enable Row Level Security (already in schema)
- Get your project URL and anon key from Settings → API
- Create an account at paystack.com
- Go to Settings → API Keys & Webhooks
- Get your Public Key and Secret Key
- Add webhook URL:
https://your-domain.vercel.app/api/payments/webhook - Subscribe to events:
charge.success,transfer.success,transfer.failed
Copy .env.local.example to .env.local and fill in:
NEXT_PUBLIC_SUPABASE_URL=https://xxxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_anon_key
SUPABASE_SERVICE_ROLE_KEY=your_service_role_key
NEXT_PUBLIC_PAYSTACK_PUBLIC_KEY=pk_live_xxxx
PAYSTACK_SECRET_KEY=sk_live_xxxx
NEXT_PUBLIC_APP_URL=http://localhost:3000
NEXT_PUBLIC_APP_NAME=TaskCloudnpm run devnpm install -g vercel
vercel login
vercel
# Set environment variables:
vercel env add NEXT_PUBLIC_SUPABASE_URL
vercel env add NEXT_PUBLIC_SUPABASE_ANON_KEY
vercel env add SUPABASE_SERVICE_ROLE_KEY
vercel env add NEXT_PUBLIC_PAYSTACK_PUBLIC_KEY
vercel env add PAYSTACK_SECRET_KEY
vercel env add NEXT_PUBLIC_APP_URL
# Deploy to production:
vercel --prod- Push this repo to GitHub
- Go to vercel.com → New Project
- Import your GitHub repo
- Add all environment variables in the Vercel dashboard
- Click Deploy
Add these to your Supabase SQL editor after running the schema:
-- Increment views
CREATE OR REPLACE FUNCTION increment_views(task_id UUID)
RETURNS void AS $$
UPDATE tasks SET views = views + 1 WHERE id = task_id;
$$ LANGUAGE sql;
-- Credit wallet (used by payment release)
CREATE OR REPLACE FUNCTION credit_wallet(user_id UUID, amount DECIMAL)
RETURNS void AS $$
UPDATE profiles SET wallet_balance = wallet_balance + amount WHERE id = user_id;
$$ LANGUAGE sql SECURITY DEFINER;Client posts task (free)
↓
Client accepts tasker bid
↓
Client funds escrow via Paystack
↓
Paystack → /api/payments/webhook (charge.success)
↓
Funds held in client wallet as "reserved"
↓
Tasker submits work
↓
Client approves submission
↓
95% of budget credited to tasker wallet
5% platform fee retained
↓
Tasker withdraws → M-Pesa or bank
↓
Paystack Transfer API triggered
taskmarket/
├── app/
│ ├── page.tsx # Landing page
│ ├── auth/
│ │ ├── login/ # Login page
│ │ └── signup/ # Signup page
│ ├── tasks/
│ │ ├── page.tsx # Public task listing
│ │ └── [id]/page.tsx # Task detail + apply
│ ├── dashboard/
│ │ ├── layout.tsx # Dashboard sidebar layout
│ │ ├── page.tsx # Overview
│ │ ├── tasks/ # Browse tasks (auth)
│ │ ├── post-task/ # Post new task
│ │ ├── my-tasks/ # Posted + applied tasks
│ │ ├── wallet/ # Deposit, withdraw, history
│ │ ├── messages/ # Real-time messaging
│ │ └── profile/ # Profile management
│ └── api/
│ └── payments/
│ ├── verify/ # Paystack verification
│ ├── withdraw/ # Withdrawal request
│ └── webhook/ # Paystack webhook
├── lib/
│ ├── supabase.ts # Supabase client
│ ├── paystack.ts # Paystack utilities
│ └── auth-context.tsx # Auth provider
├── types/
│ └── database.ts # TypeScript types
└── supabase-schema.sql # Full DB schema
- Update app name in
app/layout.tsxmetadata and throughout - Replace
TaskCloudwith your brand name - Adjust colors in
tailwind.config.js(currently green accent)
- Change
PLATFORM_FEE_PERCENTinlib/paystack.ts(currently 5%)
- Edit
CATEGORIESarray intypes/database.ts
- Add more currencies by updating Paystack config and category selectors
The app is fully responsive with:
- Mobile bottom navigation bar
- Collapsible sidebar for desktop
- Touch-friendly chat interface
- Mobile-optimized task cards
- Row Level Security (RLS) on all tables
- Paystack webhook signature verification
- Server-side payment verification (never trust client)
- Auth via Supabase JWT tokens
- Service role key only used server-side