Web app per generare e tracciare piani di allenamento settimanali personalizzati.
- Frontend: Next.js 16 (App Router) · TypeScript · Tailwind CSS v4 · Framer Motion · Shadcn/ui
- Backend: Express.js · TypeScript · Prisma ORM
- Database: PostgreSQL (locale via Docker / produzione via Railway, Render, Supabase)
- Exercise API: Wger — open source, no API key required
- Node.js 18+
- Docker Desktop (per PostgreSQL)
# dalla root del progetto
docker compose up -dcd backend
npm install
npm run db:migrate # Crea le tabelle su PostgreSQL
npm run dev # Avvia su http://localhost:4000cd frontend
npm install
npm run dev # Avvia su http://localhost:3000Aprire http://localhost:3000 nel browser.
- Collega il repo a Vercel/Netlify
- Imposta
Root Directorysufrontend - Aggiungi la variabile d'ambiente:
NEXT_PUBLIC_API_URL=https://tuo-backend.railway.app
- Crea un nuovo progetto su railway.app
- Aggiungi un servizio PostgreSQL dal marketplace → Railway ti dà una
DATABASE_URLautomaticamente - Aggiungi un secondo servizio collegando il repo GitHub, con
Root Directorysubackend - Nella tab "Variables" del servizio backend, aggiungi:
DATABASE_URL=<URL copiato dal servizio PostgreSQL di Railway> PORT=4000 - Nella tab "Settings" imposta il Start Command:
Questo applica le migrazioni automaticamente ad ogni deploy e avvia il server.
npm run db:deploy && npm run start
- Crea un Web Service su render.com, collegando il repo, con
Root Directorysubackend - Aggiungi un PostgreSQL separato da Render dashboard
- Nelle variabili d'ambiente del Web Service:
DATABASE_URL=<Internal Database URL da Render> PORT=4000 - Start Command:
npm run db:deploy && npm run start
Quando il frontend è su Netlify/Vercel, aggiorna l'origine CORS nel backend (src/index.ts):
cors({ origin: 'https://tuo-frontend.netlify.app' })- Onboarding: seleziona giorni/settimana e gruppi muscolari target
- Piano Settimanale: visualizza e interagisci con il piano generato (PPL / Full Body / Upper-Lower)
- Esercizi: card con immagini reali da Wger, serie/ripetizioni, sostituzione in-place
- Completamento: spunta esercizi singoli → sessione si completa automaticamente
- Calendario: griglia mensile con i giorni di allenamento completati evidenziati
- Storico: lista degli allenamenti completati con data e dettagli
- Dark/Light Mode: toggle nel header
Fit/
├── backend/ # Express API (porta 4000)
│ ├── src/
│ │ ├── routes/ # plans, sessions, exercises, calendar
│ │ ├── services/ # wger.service.ts, planGenerator.ts
│ │ └── prisma/ # schema + migrazioni PostgreSQL
│ ├── .env # variabili locali (non committare)
│ └── .env.example # template variabili
├── frontend/ # Next.js app (porta 3000)
│ ├── app/ # Pagine: /, /plan, /calendar, /history
│ ├── components/
│ │ ├── onboarding/
│ │ ├── plan/
│ │ ├── calendar/
│ │ ├── layout/
│ │ └── ui/
│ └── context/ # WorkoutContext (state globale)
└── docker-compose.yml # PostgreSQL 15 per sviluppo locale
| Metodo | Endpoint | Descrizione |
|---|---|---|
| POST | /api/plans |
Genera nuovo piano |
| GET | /api/plans/latest |
Piano più recente |
| GET | /api/plans/:id |
Piano specifico |
| PATCH | /api/sessions/:id/complete |
Completa/riapri sessione |
| PATCH | /api/exercises/:id/complete |
Toggle esercizio completato |
| GET | /api/exercises/:wgerId/alternatives |
Alternative per un esercizio |
| PUT | /api/exercises/:id/replace |
Sostituisce esercizio |
| GET | /api/calendar?year=&month= |
Giorni completati nel mese |
| GET | /api/calendar/history |
Storico allenamenti |
| Script | Uso |
|---|---|
npm run dev |
Server di sviluppo con hot-reload |
npm run build |
Compila TypeScript |
npm run start |
Avvia la build compilata (produzione) |
npm run db:migrate |
Crea/aggiorna il DB in sviluppo |
npm run db:deploy |
Applica migrazioni in produzione (no prompt) |
npm run db:generate |
Rigenera il Prisma client |