A full-stack web app for tracking technician comebacks, detecting repeat VINs, and reporting on shop quality trends.
| Layer | Technology |
|---|---|
| Frontend | React 18 + Recharts |
| Backend | Python FastAPI |
| Database | SQLite (local file) |
| Auth | JWT (bcrypt passwords) |
Install these before running:
- Python 3.9+ — https://www.python.org/downloads/
- Node.js 18+ — https://nodejs.org/
- pip (comes with Python)
chmod +x start.sh
./start.shDouble-click start.bat or run in Command Prompt:
start.bat
Terminal 1 — Backend:
cd backend
pip install -r requirements.txt
uvicorn main:app --host 0.0.0.0 --port 8000 --reloadTerminal 2 — Frontend:
cd frontend
npm install
npm start| URL | Purpose |
|---|---|
| http://localhost:3000 | Main app (open in browser/iPad) |
| http://localhost:8000/docs | API documentation (FastAPI Swagger) |
| Role | Username | Password |
|---|---|---|
| Manager | manager |
mini1234 |
| Advisor | advisor |
advisor1234 |
Change these in
backend/main.pyunderseed_defaults()before deploying.
- Start the app on your Mac (or a shared computer on the same WiFi network).
- Find your computer's local IP address:
- Mac: System Settings → Network → Wi-Fi → Details
- Windows:
ipconfigin Command Prompt → look for IPv4 Address
- Open Safari on iPad and navigate to:
http://YOUR-IP:3000 - Tap Share → Add to Home Screen for a native-like icon.
- Log a comeback quickly using the Log Comeback form
- Required fields: Date, Vehicle, Technician, Category, Concern
- VIN Last 7 triggers automatic repeat detection
- All advisor fields plus Fix Performed, Root Cause, Notes
- Delete records from the Comeback Log
- View Dashboard and Weekly Report
- Automatic — no configuration needed
- Any VIN appearing more than once is flagged REPEAT VIN across all records
- Visible in the log, dashboard, and weekly report
- Total comeback count
- Last 30 days activity
- Repeat VIN count
- Comebacks by technician (bar chart)
- Top comeback causes (horizontal bar chart)
- Per-technician status (Clean / Monitor / Review)
- Rolling 7-day window
- Comebacks by tech and category
- Repeat VIN list highlighted
Option A — Through the seeded defaults in backend/main.py:
techs = ["Jake", "Ernie", "Jeisson", "Michael", "Aaron"]Edit this list and restart the backend (only adds new names, won't duplicate).
Option B — Via the API at http://localhost:8000/docs → POST /technicians (manager token required).
Edit seed_defaults() in backend/main.py:
crud.create_user(db, schemas.UserCreate(
username="myles", password="yourpassword",
full_name="Myles", role="advisor"
))Edit the CATEGORIES list in both:
backend/crud.pyfrontend/src/pages/ComebackEntry.js
The database file backend/comeback_tracker.db (SQLite) stores all data locally.
Back it up regularly by copying this file.
To reset all data: delete comeback_tracker.db and restart the backend.
To make this accessible outside your local network (e.g., from a customer's device or from home):
- Deploy the backend to a VPS (e.g., DigitalOcean, Railway, Render)
- Build the frontend:
cd frontend && npm run build - Set the API URL in frontend via environment variable:
REACT_APP_API_URL=https://your-backend-url.com - Serve the
build/folder with nginx or any static host.
mini-comeback-app/
├── backend/
│ ├── main.py # FastAPI app + routes
│ ├── models.py # SQLAlchemy database models
│ ├── schemas.py # Pydantic request/response models
│ ├── crud.py # Database logic + repeat VIN detection
│ ├── database.py # SQLite connection
│ └── requirements.txt
├── frontend/
│ ├── src/
│ │ ├── pages/
│ │ │ ├── Login.js
│ │ │ ├── Dashboard.js
│ │ │ ├── ComebackEntry.js
│ │ │ ├── ComebackLog.js
│ │ │ └── WeeklyReport.js
│ │ ├── components/
│ │ │ └── Layout.js
│ │ ├── context/
│ │ │ └── AuthContext.js
│ │ ├── App.js
│ │ └── App.css
│ └── package.json
├── start.sh # Mac/Linux launcher
├── start.bat # Windows launcher
└── README.md