# manenjamir/fixora architecture

> Architecture diagram of the GitHub repository manenjamir/fixora, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/manenjamir/fixora
- Repository: https://github.com/manenjamir/fixora

## Overview

Fixora is a doorstep repair marketplace with customer and technician workflows. Customers request a free check-up, review a location-aware quote and repair tier, then track on-site or warehouse fulfillment; technicians check inventory, dispatch and inspect jobs, quote, resolve repairs, and confirm handover. The sampled booking and technician screens call job actions through shared job state, while sampled authentication uses Supabase OTP and profile lookup. Other screens and job-store internals were not sampled, so their detailed wiring is represented conservatively.

Main entry points: [`src/context/job-store.tsx`](https://github.com/manenjamir/fixora/blob/main/src/context/job-store.tsx) (Job lifecycle state), [`src/app/index.tsx`](https://github.com/manenjamir/fixora/blob/main/src/app/index.tsx) (Phone sign-in), [`src/app/(customer)/book/[category].tsx`](https://github.com/manenjamir/fixora/blob/main/src/app/(customer)/book/%5Bcategory%5D.tsx) (Request check-up), [`src/app/(tech)/job/[id].tsx`](https://github.com/manenjamir/fixora/blob/main/src/app/(tech)/job/%5Bid%5D.tsx) (Inspect and resolve)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_access["Access and roles"]
  node_signin["Phone sign-in<br/>[index.tsx]"]
  node_verify["OTP verification<br/>[verify.tsx]"]
  node_auth["Auth and profile<br/>[auth.tsx]"]
end

subgraph group_customer["Customer repair journey"]
  node_home["Service discovery<br/>[home.tsx]"]
  node_booking["Request check-up<br/>[&#91;category&#93;.tsx]"]
  node_estimate["Review estimate<br/>[&#91;id&#93;.tsx]"]
  node_tracking["Track technician<br/>[&#91;id&#93;.tsx]"]
  node_warehouse["Warehouse handover<br/>[&#91;id&#93;.tsx]"]
  node_bookings["Booking list<br/>[bookings.tsx]"]
end

subgraph group_tech["Technician operations"]
  node_tech_inbox["Job inbox<br/>[inbox.tsx]"]
  node_tech_route["ETA route<br/>[route.tsx]"]
  node_tech_job["Inspect and resolve<br/>[&#91;id&#93;.tsx]"]
  node_tech_crew["Crew view<br/>[crew.tsx]"]
end

subgraph group_state["Shared job state"]
  node_job_state[("Job lifecycle state<br/>[job-store.tsx]")]
  node_routing["Job destination rules<br/>[job-routes.ts]"]
  node_device_catalog["Device categories<br/>[devices.ts]"]
end

node_customer_actor(("Customer"))
node_tech_actor(("Technician"))
node_supabase{{"Supabase"}}

node_customer_actor -->|"signs in"| node_signin
node_tech_actor -->|"signs in"| node_signin
node_signin -->|"requests OTP"| node_auth
node_auth -->|"auth and profiles"| node_supabase
node_signin -->|"opens verification"| node_verify
node_verify -->|"verifies OTP"| node_auth
node_customer_actor -->|"browses services"| node_home
node_home -->|"selects category"| node_booking
node_booking -->|"resolves category"| node_device_catalog
node_booking -->|"creates job"| node_job_state
node_bookings -->|"reads jobs"| node_job_state
node_job_state -->|"routes by status"| node_routing
node_customer_actor -->|"reviews quote"| node_estimate
node_estimate -->|"reads and responds"| node_job_state
node_customer_actor -->|"tracks request"| node_tracking
node_tracking -->|"reads progress"| node_job_state
node_customer_actor -->|"confirms handover"| node_warehouse
node_warehouse -->|"reads and verifies"| node_job_state
node_tech_actor -->|"opens jobs"| node_tech_inbox
node_tech_inbox -->|"reads jobs"| node_job_state
node_tech_actor -->|"views route"| node_tech_route
node_tech_route -->|"reads and sorts"| node_job_state
node_tech_actor -->|"works job"| node_tech_job
node_tech_job -->|"updates lifecycle"| node_job_state
node_tech_job -->|"loads device"| node_device_catalog
node_tech_crew -->|"reads crew jobs"| node_job_state

click node_signin "https://github.com/manenjamir/fixora/blob/main/src/app/index.tsx"
click node_verify "https://github.com/manenjamir/fixora/blob/main/src/app/verify.tsx"
click node_auth "https://github.com/manenjamir/fixora/blob/main/src/context/auth.tsx"
click node_home "https://github.com/manenjamir/fixora/blob/main/src/app/(customer)/(tabs)/home.tsx"
click node_booking "https://github.com/manenjamir/fixora/blob/main/src/app/(customer)/book/%5Bcategory%5D.tsx"
click node_estimate "https://github.com/manenjamir/fixora/blob/main/src/app/(customer)/estimate/%5Bid%5D.tsx"
click node_tracking "https://github.com/manenjamir/fixora/blob/main/src/app/(customer)/track/%5Bid%5D.tsx"
click node_warehouse "https://github.com/manenjamir/fixora/blob/main/src/app/(customer)/warehouse/%5Bid%5D.tsx"
click node_bookings "https://github.com/manenjamir/fixora/blob/main/src/app/(customer)/(tabs)/bookings.tsx"
click node_tech_inbox "https://github.com/manenjamir/fixora/blob/main/src/app/(tech)/(tabs)/inbox.tsx"
click node_tech_route "https://github.com/manenjamir/fixora/blob/main/src/app/(tech)/(tabs)/route.tsx"
click node_tech_job "https://github.com/manenjamir/fixora/blob/main/src/app/(tech)/job/%5Bid%5D.tsx"
click node_tech_crew "https://github.com/manenjamir/fixora/blob/main/src/app/(tech)/(tabs)/crew.tsx"
click node_job_state "https://github.com/manenjamir/fixora/blob/main/src/context/job-store.tsx"
click node_routing "https://github.com/manenjamir/fixora/blob/main/src/lib/job-routes.ts"
click node_device_catalog "https://github.com/manenjamir/fixora/blob/main/src/constants/devices.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_signin,node_verify,node_auth toneBlue
class node_home,node_booking,node_estimate,node_tracking,node_warehouse,node_bookings toneAmber
class node_tech_inbox,node_tech_route,node_tech_job,node_tech_crew toneMint
class node_job_state,node_routing,node_device_catalog toneRose
class node_customer_actor,node_tech_actor,node_supabase toneIndigo
```

## Components

### Access and roles

- [Phone sign-in](https://github.com/manenjamir/fixora/blob/main/src/app/index.tsx): `src/app/index.tsx`
- [OTP verification](https://github.com/manenjamir/fixora/blob/main/src/app/verify.tsx): `src/app/verify.tsx`
- [Auth and profile](https://github.com/manenjamir/fixora/blob/main/src/context/auth.tsx): `src/context/auth.tsx`

### Customer repair journey

- [Service discovery](https://github.com/manenjamir/fixora/blob/main/src/app/(customer)/(tabs)/home.tsx): `src/app/(customer)/(tabs)/home.tsx`
- [Request check-up](https://github.com/manenjamir/fixora/blob/main/src/app/(customer)/book/%5Bcategory%5D.tsx): `src/app/(customer)/book/[category].tsx`
- [Review estimate](https://github.com/manenjamir/fixora/blob/main/src/app/(customer)/estimate/%5Bid%5D.tsx): `src/app/(customer)/estimate/[id].tsx`
- [Track technician](https://github.com/manenjamir/fixora/blob/main/src/app/(customer)/track/%5Bid%5D.tsx): `src/app/(customer)/track/[id].tsx`
- [Warehouse handover](https://github.com/manenjamir/fixora/blob/main/src/app/(customer)/warehouse/%5Bid%5D.tsx): `src/app/(customer)/warehouse/[id].tsx`
- [Booking list](https://github.com/manenjamir/fixora/blob/main/src/app/(customer)/(tabs)/bookings.tsx): `src/app/(customer)/(tabs)/bookings.tsx`

### Technician operations

- [Job inbox](https://github.com/manenjamir/fixora/blob/main/src/app/(tech)/(tabs)/inbox.tsx): `src/app/(tech)/(tabs)/inbox.tsx`
- [ETA route](https://github.com/manenjamir/fixora/blob/main/src/app/(tech)/(tabs)/route.tsx): `src/app/(tech)/(tabs)/route.tsx`
- [Inspect and resolve](https://github.com/manenjamir/fixora/blob/main/src/app/(tech)/job/%5Bid%5D.tsx): `src/app/(tech)/job/[id].tsx`
- [Crew view](https://github.com/manenjamir/fixora/blob/main/src/app/(tech)/(tabs)/crew.tsx): `src/app/(tech)/(tabs)/crew.tsx`

### Shared job state

- [Job lifecycle state](https://github.com/manenjamir/fixora/blob/main/src/context/job-store.tsx): `src/context/job-store.tsx`
- [Job destination rules](https://github.com/manenjamir/fixora/blob/main/src/lib/job-routes.ts): `src/lib/job-routes.ts`
- [Device categories](https://github.com/manenjamir/fixora/blob/main/src/constants/devices.ts): `src/constants/devices.ts`

### Other components

- **Customer**
- **Technician**
- **Supabase**

## Connections

- Customer → Phone sign-in: signs in
- Technician → Phone sign-in: signs in
- Phone sign-in → Auth and profile: requests OTP
- Auth and profile → Supabase: auth and profiles
- Phone sign-in → OTP verification: opens verification
- OTP verification → Auth and profile: verifies OTP
- Customer → Service discovery: browses services
- Service discovery → Request check-up: selects category
- Request check-up → Device categories: resolves category
- Request check-up → Job lifecycle state: creates job
- Booking list → Job lifecycle state: reads jobs
- Job lifecycle state → Job destination rules: routes by status
- Customer → Review estimate: reviews quote
- Review estimate → Job lifecycle state: reads and responds
- Customer → Track technician: tracks request
- Track technician → Job lifecycle state: reads progress
- Customer → Warehouse handover: confirms handover
- Warehouse handover → Job lifecycle state: reads and verifies
- Technician → Job inbox: opens jobs
- Job inbox → Job lifecycle state: reads jobs
- Technician → ETA route: views route
- ETA route → Job lifecycle state: reads and sorts
- Technician → Inspect and resolve: works job
- Inspect and resolve → Job lifecycle state: updates lifecycle
- Inspect and resolve → Device categories: loads device
- Crew view → Job lifecycle state: reads crew jobs
