Where quality‑focused clients meet skilled freelancers for work that matters.
CraftFlow is a full‑stack freelance marketplace platform that goes beyond a typical CRUD job board. It's a production‑grade system handling real‑time‑feeling messaging, notifications, multi‑facet reviews, verified freelancer trust signals, and a REST API layer — all wrapped in a responsive, animated UI with dark/light gradient theming.
It was built to answer a simple question: what does a freelance marketplace look like when it's engineered with the same rigor as the products freelancers are hired to build?
|
For Clients
|
For Freelancers
|
The app is deployed on Render with a managed PostgreSQL instance on Supabase. Cold starts on the free tier may take a few seconds on first load — that's Render spinning the dyno back up, not the app.
| Category | Capabilities |
|---|---|
| Auth & Identity | Email‑verified registration (SendGrid), admin‑toggled verified freelancer badges |
| Core Marketplace | Full CRUD for jobs, bids, services, and portfolios |
| Communication | Real‑time‑style messaging and notifications via AJAX polling |
| Proposals | Draft‑save‑before‑submit workflow so freelancers never lose a half‑written pitch |
| Trust & Reputation | Multi‑facet reviews (communication, quality, timeliness) + verified badges |
| Discovery | Advanced search and filtering by category, budget, status, and date |
| Engagement | Bookmarking/saving jobs for later |
| Dashboards | Role‑aware stats for both clients and freelancers |
| API | 8‑endpoint REST API built on DRF, with a ready‑to‑import Postman collection |
| Design | Fully responsive UI with animations and dark/light gradient themes |
| Infra | PostgreSQL on Supabase, WhiteNoise for static assets, deployed on Render |
| Layer | Technology |
|---|---|
| Backend Framework | Django 5.1 (Python 3.13) |
| API Layer | Django REST Framework |
| Database | SQLite (dev) → PostgreSQL via Supabase (production) |
| Static Assets | WhiteNoise |
| Transactional Email | SendGrid Web API |
| WSGI Server | Gunicorn |
| Config Management | python‑decouple |
| Image Handling | Pillow |
| Hosting | Render (web service) + Supabase (managed Postgres) |
Django's batteries‑included philosophy made sense for a project with this many interconnected models — jobs, bids, services, portfolios, messages, notifications, and reviews all need to talk to each other cleanly, and Django's ORM and admin panel make that manageable without reinventing the wheel. DRF layers a real API on top for anything that needs to live outside the template‑rendered pages, and Supabase's managed Postgres means production data doesn't live and die with a single dyno.
┌─────────────────────────────────────────────────────────┐
│ Client (Browser) │
│ Responsive UI · AJAX Polling · Animations │
└───────────────────────────┬─────────────────────────────┘
│
┌──────────▼──────────┐
│ Django Application │
│ ─────────────────── │
│ Views · Templates │
│ DRF API (8 endpoints)│
│ Auth + Email (SG) │
└──────────┬──────────┘
│
┌──────────▼──────────┐
│ PostgreSQL (Supabase) │
│ Jobs · Bids · Services │
│ Portfolios · Messages │
│ Notifications · Reviews│
└─────────────────────┘
Deployed end‑to‑end on Render, with static files served via WhiteNoise rather than a separate CDN — keeping the infrastructure footprint deliberately small while still production‑safe.
- Python 3.13+
- pip
- (Optional) A SendGrid account for outbound email in production
git clone https://github.com/XBanTs/craftflow.git
cd craftflowpython -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txtCopy .env.example to .env and fill in your values:
SECRET_KEY=your-secret-key
DEBUG=True
DATABASE_URL=sqlite:///db.sqlite3
ALLOWED_HOSTS=localhost,127.0.0.1
SENDGRID_API_KEY=your-sendgrid-key # optional for local dev
DEFAULT_FROM_EMAIL=your-email@gmail.compython manage.py migrate
python manage.py seed_datapython manage.py createsuperuser
python manage.py runserverVisit http://127.0.0.1:8000/ and you're in.
| Variable | Description | Example |
|---|---|---|
SECRET_KEY |
Django secret key | random 50‑character string |
DEBUG |
Debug mode | False in production |
DATABASE_URL |
Database connection string | postgres://user:pass@host:port/db |
ALLOWED_HOSTS |
Comma‑separated allowed hosts | localhost,craftflow-tyl3.onrender.com |
SENDGRID_API_KEY |
SendGrid API key for transactional email | SG.xxxxxxxx |
DEFAULT_FROM_EMAIL |
Sender address for outbound email | noreply@craftflow.com |
CraftFlow ships a REST API built on Django REST Framework, covering jobs, bids, services, and portfolios.
- Full endpoint reference:
api_docs.md - Ready‑to‑import collection:
postman_collection.json
Import the Postman collection to start exploring requests immediately — no manual setup required.
- WebSocket‑based messaging and notifications (replacing AJAX polling)
- Escrow‑style payment integration
- In‑app dispute resolution workflow
- Freelancer skill assessments / certifications
- Public API rate limiting and API keys for third‑party integrations
Contributions, issues, and feature requests are welcome.
- Fork the project
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Emmanuel Ayo "XBanTs" Oyewo Principal Software Engineer & Lead Engineer @ XJ TechSpace
- Portfolio: ayo.xjtechspace.com
- Twitter / X: @XBanTs_
- Medium: @Ayo_Oyewo
This project is licensed under the MIT License — see the LICENSE file for details.
Built with Django, deployed with intent.
⭐ If CraftFlow inspired part of your stack, consider starring the repo.




