Hi! This is the repo for my bachelor's thesis project — a marketplace web app where homeowners find local technicians (plumbers, electricians, handymen, etc.) to fix stuff around their house.
Live at: fixano.ro
Moved from my hometown to Iași and immediately realized I had no idea who to call when something breaks. My friend who started his electrical career had the opposite problem — no way to find customers. Fixano is supposed to solve both sides of that.
The idea: homeowners post a job, technicians browse the marketplace and send offers, they negotiate in a built-in chat, and payment is handled safely through the app (funds are held until the job is confirmed as done).
- Frontend: React 19 + Vite 6 + TypeScript
- Styling: Tailwind CSS v4, though a lot of dynamic components use inline styles with hex colors — just found it easier to manage certain UI states that way
- Backend: Supabase (PostgreSQL, Auth, Storage, Edge Functions)
- Payments: Stripe Connect (escrow-based, the platform holds funds until job is confirmed)
- AI: Google Gemini 2.5 Flash — used for classifying job descriptions
- Deployment: Vercel, with a custom domain (
fixano.ro) - Emails: Custom SMTP for transactional emails (confirmation, password reset)
Pretty much the full flow is working:
- Auth — email/password sign up + login, role selection (Homeowner vs Helper), email confirmation, forgot/reset password
- AI-assisted job posting — describe the problem in plain text, Gemini 2.5 Flash auto-fills the category, title, and urgency level
- Image uploads — up to 3 photos per job, stored in Supabase Storage
- Marketplace — helpers browse open jobs with search + filter by category and urgency
- Offers system — helpers send a price + message offer per job
- Chat — auto-created chatroom when an offer is sent, supports text + image messages, 4-second polling for new messages
- Price negotiation — offer bubbles inside the chat, ability to counter-offer, only one active offer at a time (old ones auto-declined by a DB trigger)
- Stripe Connect payments — homeowner pays through Stripe Checkout, funds are held, released to the technician only after the homeowner confirms the work is done (10% platform fee)
- Job lifecycle — Open → Assigned → Pending Completion → Completed, with the technician marking done and homeowner confirming
- Dispute resolution — either party can report an issue; the other side can agree to a refund (processed via Stripe) or escalate; escalation emails a full chat transcript to the admin via Resend API
- Reviews & ratings — bidirectional after job completion (both sides review each other), auto-updates rating averages via DB trigger
- Public profiles — visible to anyone, showing rating, reviews received, bio
- Notifications — in-app bell, 5 different notification types auto-generated by DB triggers, 30-second polling
- Responsive design — works on mobile too, bottom nav bar on small screens
npm installcp .env.example .env— fill in your Supabase project URL and anon key (you'll need your own Supabase project)- Run the SQL migration files in
/supabase/in order (001_profiles.sql→006_delete_account.sql) in the Supabase SQL editor npm run dev
Note: The Stripe and Gemini features need additional env vars (Stripe secret key, Gemini API key). The app works without them but those flows will fail.
src/
├── pages/ — full screens (Dashboard, JobDetails, ChatRoom, Marketplace, ...)
├── components/ — reusable UI bits (buttons, badges, chat offer bubbles, ...)
├── context/ — Auth context
├── hooks/ — useNotifications (polling hook)
├── lib/ — Supabase client, constants, helpers
└── index.css — design tokens + Tailwind theme
supabase/
├── 001_profiles.sql — 006_...sql — DB migrations (run in order)
└── functions/ — Edge Functions (AI classifier, Stripe flows, dispute escalation)
- There are
TODOcomments in a few places, planning to clean those up. - The chat uses polling (4s) instead of WebSockets — kept it simple for the thesis scope.
- SQL files and Edge Functions have a different style from the frontend code, that was intentional.
Developed for my University Thesis. Not for commercial use yet.