Skip to content

MeraruIoanLucian/Fixano

Repository files navigation

Fixano

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

Why I made this

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).

Tech Stack

  • 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)

What's implemented

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

Running it locally

  1. npm install
  2. cp .env.example .env — fill in your Supabase project URL and anon key (you'll need your own Supabase project)
  3. Run the SQL migration files in /supabase/ in order (001_profiles.sql006_delete_account.sql) in the Supabase SQL editor
  4. 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.

Project Structure

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)

Some notes

  • There are TODO comments 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.

About

Marketplace for Home Technical Services

Resources

Stars

2 stars

Watchers

1 watching

Forks

Contributors