Get up and running with LiftShift in 5 minutes!
- Node.js v18+ (download)
- npm v9+ (comes with Node.js)
-
Clone the repository
git clone https://github.com/aree6/LiftShift.git cd LiftShift -
Install dependencies
npm install
-
Start development server
npm run dev
-
Open in browser
http://localhost:3000
That's it! The app is now running locally. 🎉
-
Select your platform
- Strong (CSV)
- Hevy (Login or CSV)
-
Complete setup
- Strong: choose body type + unit, then import Strong CSV
- Hevy: choose body type + unit, then Continue to login/sync (or import Hevy CSV)
Strong CSV imports support common export variants, including semicolon-delimited (;) files with quoted fields and unit-suffixed headers like Weight (kg).
- Explore your data
- Dashboard - Overview of your training
- Exercises - Detailed performance per exercise
- History - Browse individual workout sessions
- Volume Tracking - See total weight lifted over time
- Personal Records - Track your PRs automatically
- 1RM Estimates - Get estimated one-rep maxes
- Filters - Filter by month or specific dates
- Offline - All data stored locally, no uploads
- PR: Best-ever weight for an exercise (shown with absolute change)
- Volume PR: Best-ever single-set volume for an exercise (
weight × reps, across all history; shown with percent change)
# Start dev server
npm run dev
# Build for production
npm run build
# Preview production build locally
npm run previewfrontend/
├── index.html # Vite HTML entry
├── index.tsx # React entry
├── App.tsx # Main app component
├── components/ # React components
│ ├── Dashboard.tsx # Dashboard view
│ ├── ExerciseView.tsx # Exercise analytics
│ ├── HistoryView.tsx # Workout history
│ └── CSVImportModal.tsx
├── utils/ # Utility functions
│ ├── analysis/ # Core analytics logic
│ ├── csv/ # CSV parsing
│ └── storage/ # Local storage management
└── types.ts # TypeScript types
- Edit files in
frontend/ - Changes hot-reload automatically
- Check browser for results
- Test production build:
npm run build && npm run preview
See DEPLOYMENT.md for backend (Render/Railway) + frontend (Netlify).
# Use different port
npm run dev -- --port 3001# Clear cache and reinstall
rm -rf node_modules dist
npm install
npm run build- Ensure CSV is from Hevy app export
- Check file format is
.csv - Try with smaller file first
If a user gets "Load failed" or "Failed to fetch" on the deployed site (not local dev), this is typically caused by:
- Content blockers / Ad blockers - Safari and browser extensions can block API requests
- VPNs - Can block or modify network requests
- Corporate/school firewalls - May block external API calls
Solutions for users:
- Disable content blockers for the site (Safari → Settings → Extensions)
- Try a different network (switch WiFi ↔ cellular)
- Try an incognito/private window
- Use a different browser (Chrome, Firefox)
If you open the dev server from your phone (for example http://192.168.x.x:3000) and actions like Hevy login fail with a network error, it usually means the frontend is trying to call the backend at http://localhost:....
On your phone, localhost points to the phone itself.
Fix:
- Keep using the LAN URL for the frontend, and ensure the frontend uses same-origin
/api/...(Vite will proxy it to the backend). - Alternatively, set
VITE_BACKEND_URLto your Mac's LAN IP (example:http://192.168.x.x:5050).
Export your Hevy data monthly to keep LiftShift updated.
Filter by month to see training trends and seasonal patterns.
Check the Exercises tab to see when you hit new personal records.
Take screenshots or export data to share progress with coaches/friends.
- Check Troubleshooting section
- Read Full README
- Open GitHub Issue
Happy training! 🏋️💪