Tutti i lavori

Personal trainer — sito + agenda + FitLab

Prenotazioni che rispettano il calendario del trainer, più un'area clienti e un cockpit per la sua attività.

Stack:
  • Astro
  • React
  • React Three Fiber
  • Cloudflare Workers
  • Cloudflare D1
  • Google Calendar API
  • Resend
  • Workers AI
Video di lancio · 9:16
  • ≈45endpoint API per prenotazioni, admin, area clienti e cockpit
  • 24migrazioni SQL su Cloudflare D1
  • €0di hosting al mese: piani gratuiti di Cloudflare e Resend

Prenotazioni che si piegano al suo calendario

Un motore di prenotazione condiviso dal sito e da un worker cron, il suo Google Calendar come fonte degli impegni, un database D1, un'area clienti e un cockpit per l'attività.

Tocca un blocco per vedere cosa fa.

  • Ingresso
  • Persone
  • Logica
  • Dati
  • Uscita
  • Infrastruttura
Cosa entra
Motore condiviso
Un database
Cosa esce

Ingresso

Sito one-page

Astro SSR su Workers con isole React. Il wizard chiede al server gli slot liberi; il bilanciere 3D si carica solo su desktop e senza reduced motion.

  • Astro
  • React
  • React Three Fiber

Passa a Motore prenotazioni

La sezione Allenamento del sito, un fotogramma della registrazione da computer

Il problema

Un personal trainer prendeva gli appuntamenti a mano, tra messaggi e telefonate. Voleva un sistema di prenotazione suo, senza abbonamenti e senza un software nuovo da imparare: quando blocca un orario sul suo Google Calendar, quello slot sparisce dal sito.

Cosa ho costruito

  1. Ho diviso il codice in un monorepo pnpm: il sito, un worker cron e un motore di prenotazione condiviso da entrambi.
  2. Ho calcolato gli slot lato server dai suoi orari di lavoro meno gli impegni del calendario, salvato ogni orario in UTC e convertito in un solo modulo testato.
  3. Ho aggiunto un'area clienti con accesso tramite link email e codice a 6 cifre: anamnesi, misurazioni, programmi di allenamento, workout con log delle serie, programma in PDF.
  4. Ho costruito un cockpit per clienti, pacchetti e incassi, dove un vocale diventa una bozza di movimenti (Whisper, poi Claude) che lui conferma prima di salvare.
  5. Ho messo nell'hero un bilanciere 3D procedurale, scaricato solo su desktop quando il browser è inattivo; i telefoni ricevono un poster CSS.

La parte difficile

Evitare le doppie prenotazioni senza transazioni. Ogni prenotazione è un solo insert con guardia NOT EXISTS, che D1 esegue uno alla volta, e il calendario viene ricontrollato subito prima della scrittura. I cambi d'ora sono coperti da test su entrambi i passaggi dell'ora legale.

Risultato

In produzione sul dominio del cliente, sui piani gratuiti di Cloudflare e Resend. Lo stesso motore è diventato la base di due siti per clienti successivi.

Il mio ruolo

Progetto per un cliente, in solitaria. Ho raccolto i requisiti, scelto l'architettura, rivisto e collaudato ogni flusso con una checklist di go-live e configurato dominio, DNS e segreti; Claude Code ha scritto 219 dei 220 commit.